在没有数据重复的情况下爆炸数据框的每一列
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|
#+----+----+----+
【讨论】:
以上是关于在没有数据重复的情况下爆炸数据框的每一列的主要内容,如果未能解决你的问题,请参考以下文章