我有一本包含20多个数据帧的字典。它们每个都有不同的列和大小。
我想遍历字典并一次比较2个数据帧(left_df
和rigt_df
),将right_df
中不存在的列添加到{ {1}},反之亦然。目标是合并所有20多个df,最后得到一个单个数据帧。
这是我尝试的方法,我首先将dfs分为2个字典:
left_df
我仅用2个数据帧尝试过此操作,其中每个字典中只有一个df,它确实给了我想要的结果,但是当我有2个以上的数据帧时,它似乎并没有做到这一点。
答案 0 :(得分:0)
2个具有不同列的DataFrame的并集很简单,只需将缺少的列添加为null,然后调用unionAll
。
这是一个接受两个DataFrame并返回其并集的函数。 它假定两个DataFrame中都缺少列,但公共列必须具有相同的数据类型。
def union_dataframes(df1, df2):
# use dict to preserve columns order, set does not
cols1 = list(dict.fromkeys(df1.columns).keys())
cols2 = list(dict.fromkeys(df2.columns).keys())
merged_cols = list(dict.fromkeys(cols1 + cols2).keys())
complete_cols1 = [col(c).alias(c) if c in cols1 else lit(None).alias(c) for c in merged_cols]
complete_cols2 = [col(c).alias(c) if c in cols2 else lit(None).alias(c) for c in merged_cols]
return df1.select(complete_cols1).unionAll(df2.select(complete_cols2))
然后,您可以将所有DataFrames放在列表中,并使用上述功能将其缩小:
list_df = [df1, df2, df3, ...]
result_df = reduce(lambda a, b: union_dataframes(a, b), list_df)