我正在尝试在熊猫中合并一系列数据框。我有一个 dfsdfs
列表,以及它们相应标签的列表,labels
我想将所有 dfs 合并到 1 个 df 中,以便 df 中的公共标签从labels
列表中的标签中获取后缀。IE:
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 被索引的列名。联合不常见的列名(如在外部连接中)。如果一列出现在多个 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
这假设合并发生在每个 dfs 的索引上。新列以外部连接样式添加,但常见的列(而不是索引的一部分)通过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 中更优雅地完成,或者已经作为内置函数存在?