在没有数据重复的情况下爆炸数据框的每一列

Posted

技术标签:

【中文标题】在没有数据重复的情况下爆炸数据框的每一列【英文标题】:explode each column of dataframe without data duplication 【发布时间】:2022-01-19 16:49:00 【问题描述】:

我正在使用 pyspark 或 pandas

我有这个数据框,每一列都包含一个值列表:

COL1      |  COL2               |  COL3
["A","B"] |  ["V1", "V2", "V3"] |  ["V4","V5"]

我需要分解每一列以不同的方式呈现数据并生成这个数据框,列之间没有数据顺序:

COL1      |  COL2               |  COL3
A         |    V1               |   V4
B         |    V2               |   V5
null      |    V3               |   null

感谢您的帮助

【问题讨论】:

this 的可能重复项。 【参考方案1】:

试试这个:

df = df.apply(lambda row: row.apply(lambda cell: cell + [np.nan] * (max(row.apply(len)) - len(cell))), axis=1).explode(df.columns.tolist())

输出:

>>> df
  COL1 COL2 COL3
0    A   V1   V4
0    B   V2   V5
0  NaN   V3  NaN

【讨论】:

【参考方案2】:

使用pd.concat:

out = pd.concat([sr.explode(ignore_index=True) for _, sr in df.iteritems()], axis=1)
print(out)

# Output:
  COL1 COL2 COL3
0    A   V1   V4
1    B   V2   V5
2  NaN   V3  NaN

【讨论】:

【参考方案3】:

使用 Spark 内置函数 arrays_zip and explode 获得所需的输出。

Example:

df.select(explode(arrays_zip(col("col1"),col("col2"),col("col3")))).\
select("col.*").\
show(10,False)

#+----+----+----+
#|col1|col2|col3|
#+----+----+----+
#|a   |v1  |v4  |
#|b   |v2  |v5  |
#|null|v3  |null|
#+----+----+----+

【讨论】:

以上是关于在没有数据重复的情况下爆炸数据框的每一列的主要内容,如果未能解决你的问题,请参考以下文章

pyspark:在数据框的每一列中获取唯一项目

在 spark scala 中对数据框的每一列进行排序

如何在循环中将不同大小的列表附加到空熊猫数据框的每一列?

将函数应用于熊猫中数据框的每一列

如何为熊猫数据框的每一列应用具有不同时间常数的一阶过滤器?

在给定“映射数据框”的情况下爆炸熊猫数据框的行