6

我无法将一组 DataFrame 组合成一个 DataFrame,并合并到特定列上。

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

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

每个 DataFrame 包含给定月份的 Top 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()or chain时.merge,我一直遇到麻烦。

有什么想法吗?谢谢!

4

1 回答 1

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

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

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
于 2013-09-16T22:26:56.763 回答