【问题标题】:Merging multiple dataframes on column合并列上的多个数据框
【发布时间】:2016-11-22 20:38:12
【问题描述】:

我正在尝试合并/加入多个Dataframes,但到目前为止我还没有运气。我找到了merge 方法,但它只适用于两个数据框。我还发现这个 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

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

【问题讨论】:

  • 如果所有 DataFrame 中的列名都相同,那么您希望输出的实际样子是什么?
  • @chrisaycock 我添加了示例输入和预期输出。我基于 merge,其中 pandas 自动为其他列的名称添加后缀

标签: python pandas dataframe


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    使用减少:

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

    将 df_list 视为您的数据框列表

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-12
        • 2011-05-11
        • 1970-01-01
        • 2017-06-08
        • 2019-12-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多