繁体   English   中英

在列上合并多个数据帧

[英]Merging multiple dataframes on column

我正在尝试合并/加入多个Dataframe ,到目前为止我没有运气。 我找到了merge方法,但它只适用于两个Dataframe。 我也发现这个SO 答案建议做这样的事情:

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

索引可能在数据帧之间无序,但保证它们将存在。

使用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()

在此输入图像描述

使用减少:

def my_merge(df1, df2):
    return df1.merge(df2,on='name')

final_df = reduce(my_merge, df_list)

将df_list视为数据帧列表

@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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM