gpt4 book ai didi

python - 在 Pandas 中合并数据帧时的组合爆炸

转载 作者:太空狗 更新时间:2023-10-29 21:03:41 25 4
gpt4 key购买 nike

我正在尝试合并 pandas 中的一系列数据框。我有一个 dfs 列表,dfs 和它们相应标签的列表 labels 我想将所有 dfs 合并到 1 df 中,这样来自 df 的公共(public)标签从 labels 列表中的标签获取后缀。即:

def mymerge(dfs, labels):
labels_dict = dict([(d, l) for d, l in zip(dfs, labels)])
merged_df = reduce(lambda x, y:
pandas.merge(x, y,
suffixes=[labels_dict[x], labels_dict[y]]),
dfs)
return merged_df

当我尝试这样做时,出现错误:

pandas.tools.merge.MergeError: Combinatorial explosion! (boom)

我正在尝试进行一系列合并,每次合并最多增长 N 列,其中 N 是列表中“下一个”df 中的列数。最终的 DF 的列数应与所有 df 列加在一起的列数一样多,因此它会累加而不是组合增长。

我正在寻找的行为是:在指定的列名上加入 dfs(例如,由 on= 指定)或 dfs 被索引的列名。联合非公共(public)列名称(如在外部连接中)。如果一个列出现在多个 dfs 中,可选择覆盖它。仔细查看文档,听起来 update 可能是执行此操作的最佳方式。虽然当我尝试 join='outer' 时它引发了一个异常信号,表明它没有实现。

编辑:

这是我对此的实现尝试,它不处理后缀但说明了我正在寻找的合并类型:

def my_merge(dfs_list, on):
""" list of dfs, columns to merge on. """
my_df = dfs_list[0]
for right_df in dfs_list[1:]:
# Only put the columns from the right df
# that are not in the existing combined df (i.e. new)
# or which are part of the columns to join on
new_noncommon_cols = [c for c in right_df \
if (c not in my_df.columns) or \
(c in on)]
my_df = pandas.merge(my_df,
right_df[new_noncommon_cols],
left_index=True,
right_index=True,
how="outer",
on=on)
return my_df

这假设合并发生在每个 df 的索引上。新列以外部联接样式添加,但常用列(不是索引的一部分)通过 on= 关键字在联接中使用。

例子:

df1 = pandas.DataFrame([{"employee": "bob",
"gender": "male",
"bob_id1": "a"},
{"employee": "john",
"gender": "male",
"john_id1": "x"}])
df1 = df1.set_index("employee")
df2 = pandas.DataFrame([{"employee": "mary",
"gender": "female",
"mary_id1": "c"},
{"employee": "bob",
"gender": "male",
"bob_id2": "b"}])
df2 = df2.set_index("employee")
df3 = pandas.DataFrame([{"employee": "mary",
"gender": "female",
"mary_id2": "d"}])
df3 = df3.set_index("employee")
merged = my_merge([df1, df2, df3], on=["gender"])
print "MERGED: "
print merged

在这种情况下,您可以根据一组常见但不太重要的列的标签,任意为每个 df 标记一个后缀。上述合并操作是否可以在 pandas 中更优雅地完成,或者已经作为内置函数存在?

最佳答案

你的方法的输出:

In [29]: merged
Out[29]:
bob_id1 gender john_id1 bob_id2 mary_id1 mary_id2
employee
bob a male NaN b NaN NaN
john NaN male x NaN NaN NaN
mary NaN female NaN NaN c d

内置 Pandas 的解决方案 df.combine_first :

In [28]: reduce(lambda x,y: x.combine_first(y), [df1, df2, df3])
Out[28]:
bob_id1 bob_id2 gender john_id1 mary_id1 mary_id2
employee
bob a b male NaN NaN NaN
john NaN NaN male x NaN NaN
mary NaN NaN female NaN c d

要为每个帧的列添加后缀,我建议在调用 combine_first 之前重命名列。

另一方面,您可能想研究像 pd.concat([df1, df2, df3], keys=['d1', 'd2', 'd3'], axis= 1),它生成一个包含 MultiIndex 列的数据框。在这种情况下,可能需要考虑将性别作为索引的一部分,或者忍受它的重复。

关于python - 在 Pandas 中合并数据帧时的组合爆炸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14199168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com