循环遍历 df 字典以合并 Pandas 中的 df

Posted

技术标签:

【中文标题】循环遍历 df 字典以合并 Pandas 中的 df【英文标题】:Looping through df dictionary in order to merge df's in Pandas 【发布时间】:2014-10-28 15:37:30 【问题描述】:

我有以下带有数据框的字典

A = pd.DataFrame([[2, 1], [2, 1], [2, 1]], columns=['A', 'B'], index = [1, 2, 3])
B = pd.DataFrame([[1, 1], [2, 2], [3, 3]], columns=['A', 'B'], index = [1, 2, 3])
C = pd.DataFrame([[1, 2], [1, 2], [1, 2]], columns=['A', 'B'], index = [1, 2, 3])

df_all = 'df1': A, 'df2': B, 'df3': C

我想通过索引将它们“内部”合并,但使用 for 循环进行迭代。它必须相当于做

df4 = pd.merge(A, B, left_index=True, right_index=True, how='inner')
df5 = pd.merge(df4, C, left_index=True, right_index=True, how='inner')

结果会是这样的

   A_x  B_x  A_y  B_y  A  B
1    2    1    1    1  1  2
2    2    1    2    2  1  2
3    2    1    3    3  1  2

我尝试了一些类似的傻事

for key, value in df_all.iteritems():
    df = pd.merge(value, value, left_index=True, right_index=True, how='inner')

但这给了我一个无意义的结果。

感谢您的帮助。

【问题讨论】:

试试pd.merge(A, A, ...),你就会明白为什么你的结果不起作用了。 @chrisaycock 我知道他们为什么不工作。问题是我不知道如何让它们工作。有什么线索吗? 【参考方案1】:

concat 有你吗:

In [11]: pd.concat([A, B, C], axis=1, keys=['df1', 'df2', 'df3'])
Out[11]:
   df1     df2     df3
     A  B    A  B    A  B
1    2  1    1  1    1  2
2    2  1    2  2    1  2
3    2  1    3  3    1  2

【讨论】:

【参考方案2】:
import pandas as pd
import functools

A = pd.DataFrame([[2, 1], [2, 1], [2, 1]], columns=['A', 'B'], index = [1, 2, 3])
B = pd.DataFrame([[1, 1], [2, 2], [3, 3]], columns=['A', 'B'], index = [1, 2, 3])
C = pd.DataFrame([[1, 2], [1, 2], [1, 2]], columns=['A', 'B'], index = [1, 2, 3])

df_all = 'df1': A, 'df2': B, 'df3': C
merge = functools.partial(pd.merge, left_index=True, right_index=True, how='inner')
df = functools.reduce(merge, df_all.values())
print(df)

产量

   A_x  B_x  A_y  B_y  A  B
1    2    1    1    2  1  1
2    2    1    1    2  2  2
3    2    1    1    2  3  3

请注意,df_all.values() 以未指定的顺序返回 dict 中的值。如果你想要一个特定的顺序,你必须做一些像按键排序这样的事情......


或者,您可以使用 pd.concat 创建一个带有分层列的 DataFrame:

df = pd.concat(df_all, axis=1).dropna(axis=0)
print(df)

产量

   df1     df2     df3   
     A  B    A  B    A  B
1    2  1    1  1    1  2
2    2  1    2  2    1  2
3    2  1    3  3    1  2

(警告:在这里使用pd.concat 是脆弱的——我假设DataFrames 没有NaN 值,但可能有不同的索引。dropna 然后用于生成内部连接。)

【讨论】:

df 有不同的索引。 concat 选项是一个不错的选择。谢谢 当然df_all.values() 是一个列表(或可迭代的),因此如果您愿意,可以在此处提供不同的列表。 最后一个问题。是否可以将分层 df 转换为普通 df....就像用 df1..df2 摆脱额外的级别? 愚蠢的问题。仅供参考,答案是 df.columns = df.columns.get_level_values(1) 另一种选择是使用df = pd.concat(df_all.values(), axis=1).dropna(axis=0)。 (所以一开始就没有创建分层列。)

以上是关于循环遍历 df 字典以合并 Pandas 中的 df的主要内容,如果未能解决你的问题,请参考以下文章

循环遍历数据框字典

根据附加的字典列表在 df 中创建新列并遍历字典 Pandas 列表

Python---循环遍历带有数据框的字典

在python中循环遍历数据框字典并将字典中的每个数据框与单个数据框合并

如何循环遍历 Pandas df?

使用 For 循环修改 Pandas 中的 DataFrame 字典