【问题标题】:Pandas: how to merge different dataframes?Pandas:如何合并不同的数据框?
【发布时间】:2018-06-30 18:34:44
【问题描述】:

我有两个数据框 df1df2

第一个数据框包含人名:

df1  NAME
0    Paul
1    Jack
2    Anna
3    Tom
4    Eva

和第二个名字,其中包含每个人收到和支付的金额信息。有些人不在df1,例如Zack。有些人无法出现在列表中,例如Tom

df2  Receiver Payer Amount  
0     Paul    Jack   300 
1     Anna    Paul   600
2     Anna    Eva    100
3     Eva     Zack   400

我想创建一个数据框,其中包含每个人收到和支付的所有金额。所以:

df3  NAME   RECEIVED  PAYED
0    Paul     300      600
1    Jack      0       300
2    Anna     700       0
3    Tom      NaN      NaN
4    Eva      400      100  

【问题讨论】:

    标签: python pandas dataframe group-by


    【解决方案1】:

    用途:

    df3 = (df1.join(df2.melt('Amount', value_name='NAME', var_name='type')
                       .groupby(['NAME','type'])['Amount']
                       .sum()
                       .unstack(fill_value=0), on='NAME'))
    print (df3)
       NAME  Payer  Receiver
    0  Paul  600.0     300.0
    1  Jack  300.0       0.0
    2  Anna    0.0     700.0
    3   Tom    NaN       NaN
    4   Eva  100.0     400.0
    

    解释

    1. 首先通过melt重塑DataFrame
    2. 每个 NAMEtype 聚合 sum
    3. 通过unstack 重塑第二级MultiIndex 的列
    4. 最后离开join 到第一个DataFrame

    pivot_table 的另一种解决方案:

    df3 = (df1.join(df2.melt('Amount', value_name='NAME', var_name='type')
                       .pivot_table(index='NAME', 
                                    columns='type', 
                                    values='Amount', 
                                    aggfunc='sum',
                                    fill_value=0), on='NAME'))
    print (df3)
       NAME  Payer  Receiver
    0  Paul  600.0     300.0
    1  Jack  300.0       0.0
    2  Anna    0.0     700.0
    3   Tom    NaN       NaN
    4   Eva  100.0     400.0
    

    必要时最后一个rename 列:

    df3 = df3.rename(columns={'Receiver':'RECEIVED','Payer':'PAYED'})
    print (df3)
       NAME  PAYED  RECEIVED
    0  Paul  600.0     300.0
    1  Jack  300.0       0.0
    2  Anna    0.0     700.0
    3   Tom    NaN       NaN
    4   Eva  100.0     400.0
    

    详情

    print (df2.melt('Amount', value_name='NAME', var_name='type'))
    
       Amount      type  NAME
    0     300  Receiver  Paul
    1     600  Receiver  Anna
    2     100  Receiver  Anna
    3     400  Receiver   Eva
    4     300     Payer  Jack
    5     600     Payer  Paul
    6     100     Payer   Eva
    7     400     Payer  Zack
    

    【讨论】:

    • 我收到了一个错误'DataFrame' object has no attribute 'melt'
    • @emax - 是pandas版本低的问题,把df2.melt('Amount', value_name='NAME', var_name='type')改成pd.melt(df2, 'Amount', value_name='NAME', var_name='type')
    • @jazreal 太好了,谢谢。我收到group_by 的相同错误。我应该以同样的方式解决这个问题吗?
    • @emax - 你认为groupby 吗?取而代之的是group_by,好像错字了。
    • @jazreal 是的,这是一个错字,抱歉。但是在groupby 行我有这个错误:TypeError: unhashable type: list
    猜你喜欢
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 2015-03-21
    • 2019-03-08
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    相关资源
    最近更新 更多