【问题标题】:Merge a list of DataFrame's on a column? [duplicate]合并列上的 DataFrame 列表? [复制]
【发布时间】:2013-09-21 05:00:05
【问题描述】:

我在将一组 DataFrame 组合成一个 DataFrame 时遇到问题,并合并到特定的列上。

我有一个名为 data 的 DataFrame 列表,每个元素 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() 或链接.merge 时,我总是遇到麻烦。

有什么想法吗?谢谢!

【问题讨论】:

    标签: python filter merge pandas dataframe


    【解决方案1】:

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

    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
    

    【讨论】:

    • 对不起,我的问题不清楚。我会在编辑中澄清。 data 是 DataFrame 的列表。
    • @alokv28 哦,我想我现在明白了,你想链接合并操作。我更新了答案。
    猜你喜欢
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2022-01-24
    • 2016-01-17
    • 1970-01-01
    • 2018-10-02
    • 2017-05-10
    • 2018-08-31
    相关资源
    最近更新 更多