我正在尝试合并/加入多个Dataframe
,到目前为止,我没有运气。我找到了merge
方法,但它仅适用于两个Dataframe。我还发现这个SO answer建议做类似的事情:
df1.merge(df2,on='name').merge(df3,on='name')
不幸的是,它不适用于我的情况,因为我有20多个数据帧。
我的下一个想法是使用join
。根据连接多个数据帧时的参考,我需要使用列表,只有我可以加入索引列。所以我改变了所有列的索引(好吧,它可以用语法轻松完成)并最终得到类似的东西:
df.join([df1,df2,df3])
不幸的是,这种方法也失败了,因为其他列名在所有数据帧中都是相同的。我决定做最后一件事,那就是重命名所有列。但是当我最终加入一切时: df = pd.Dataframe() df.join([DF1,DF2,DF3])
我收到了空数据框。我不知道,我怎么能加入他们。有人可以提出更多建议吗?
EDIT1:
示例输入:
import pandas as pd
df1 = pd.DataFrame(np.array([
['a', 5, 19],
['b', 14, 16],
['c', 4, 9]]),
columns=['name', 'attr1', 'attr2'])
df2 = pd.DataFrame(np.array([
['a', 15, 49],
['b', 4, 36],
['c', 14, 9]]),
columns=['name', 'attr1', 'attr2'])
df1
name attr1 attr2
0 a 5 19
1 b 14 16
2 c 4 9
df2
name attr1 attr2
0 a 15 49
1 b 4 36
2 c 14 9
预期产出:
df
name attr1_1 attr2_1 attr1_2 attr2_2
0 a 5 19 15 49
1 b 14 16 4 36
2 c 4 9 14 9
索引可能在数据框架之间无序,但保证它们将存在。
答案 0 :(得分:8)
使用pd.concat
dflist = [df1, df2]
keys = ["%d" % i for i in range(1, len(dflist) + 1)]
merged = pd.concat([df.set_index('name') for df in dflist], axis=1, keys=keys)
merged.columns = merged.swaplevel(0, 1, 1).columns.to_series().str.join('_')
merged
或者
merged.reset_index()
答案 1 :(得分:1)
使用reduce:
def my_merge(df1, df2):
return df1.merge(df2,on='name')
final_df = reduce(my_merge, df_list)
将df_list视为数据帧列表
答案 2 :(得分:-1)
@piRSquared的解决方案适用于20多个数据帧,请参阅以下脚本以创建20多个示例数据帧:
N = 25
dflist = []
for d in range(N):
df = pd.DataFrame(np.random.rand(3,2))
df.columns = ['attr1', 'attr2']
df['name'] = ['a', 'b', 'c']
dflist.append(df)