循环遍历 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 列表