合并列上的DataFrame列表?

时间:2013-09-16 22:21:47

标签: python filter merge pandas dataframe

我无法将DataFrame数组合并到单个DataFrame中,并在特定列上合并。

我有一个名为data的DataFrame列表,每个元素data[i]如下所示:

     Rank  Name
2400    1 name1
2401    2 name2
2402    3 name3
2403    4 name4
2404    5 name5

每个DataFrame包含给定月份的前5个列表,该列表包含一年的月度结果。

我希望最终的合并DataFrame看起来像这样:

     Rank  Name_month1 Name_month2 Name_month3 ...
2400    1        name1       name1       name1 ...
2401    2        name2       name2       name2 ...
2402    3        name3       name3       name3 ...
2403    4        name4       name4       name4 ...
2404    5        name5       name5       name5 ...

其中每一列在第一列之后对应于每月排名。

合并列表中的2个DataFrame data

没有问题
pandas.merge(data[0], data[1], on='Rank', suffix=['_month1', '_month2'])

但是当我尝试使用filter()或链.merge时,我一直遇到麻烦。

有什么想法?谢谢!

2 个答案:

答案 0 :(得分:6)

问题在于,当您进行第一次合并时,您更改了列的名称(添加后缀),并且在第二次合并时不会发生名称冲突,因此第二次合并中的后缀将是永远不会被使用。解决方案是在合并后手动重命名列。

In [2]: df
Out[2]:       Rank   Name
        2400     1  name1
        2401     2  name2
        2402     3  name3
        2403     4  name4
        2404     5  name5
In [3]: df.merge(
            df, on='Rank', suffixes=['_month1', '_month2']
        ).merge(df, on='Rank').rename(
            columns={'Name': 'Name_month3'}
        ).merge(df, on='Rank').rename(
            columns={'Name': 'Name_month4'}
        )
Out[3]:    Rank Name_month1 Name_month2 Name_month3 Name_month4
        0     1       name1       name1       name1       name1
        1     2       name2       name2       name2       name2
        2     3       name3       name3       name3       name3
        3     4       name4       name4       name4       name4
        4     5       name5       name5       name5       name5

如果您有一个DataFrame列表,请执行以下操作:

In [4]: data = [df, df, df, df]
        current = data[0].rename(columns={'Name': 'Name_month1'})
        for i, frame in enumerate(data[1:], 2):
            current = current.merge(frame, on='Rank').rename(
                         columns={'Name': 'Name_month%d' % i})
        current
Out[4]:    Rank Name_month1 Name_month2 Name_month3 Name_month4
        0     1       name1       name1       name1       name1
        1     2       name2       name2       name2       name2
        2     3       name3       name3       name3       name3
        3     4       name4       name4       name4       name4
        4     5       name5       name5       name5       name5

答案 1 :(得分:0)

我创建了一个Gist,其中包含一个用于连接数据帧“列表”的函数。该列表实际上是一个字典,其中包含的键是在列名冲突的情况下使用的后缀:

加入pandas数据帧列表(dict)

https://gist.github.com/mpschr/5db20df78c034654f030