繁体   English   中英

如何使用另一个数据框添加数据框并基于列添加公共列值?

[英]how to add a dataframe with another dataframe and add common columns values based on a column?

我的第一个数据框:

    import pandas as pd
    
    df1 = pd.DataFrame({'CONTRACT':['Tom', 'nick', 'krish', 'jack'],
            'buy_qty':[20, 40, 50, 60],
            'buy_val':[100,120,140,160],
            'factor':[15,20,25,30],
            })
    
        CONTRACT    buy_qty buy_val factor
    0   Tom          20      100    96
    1   nick         40      110    93
    2   krish        50      140    91
    3   jack         60      160    83
      

第二个数据框:

df2 = pd.DataFrame({'CONTRACT': ['Tom', 'nick', 'amit', 'joy'],
            'buy_qty': [5, 6, 15, 30],
            'buy_val': [15, 20, 35, 16],
            'factor': [67, 89, 76, 69]}

df2:
        CONTRACT    buy_qty buy_val factor
    0   Tom           5     15       67
    1   nick          6     20       89
    2   amit          15    35       76
    3   joy           30    16       69

我想要这样的数据框(df2的所有CONTRACT值和df1的不常见CONTRACT值,通过添加常见的CONTRACTS的buy_qty和buy_val和因子将来自df2(最新数据框)......) -

        CONTRACT    buy_qty  buy_val  factor
    0   Tom         25*        115*      67
    1   nick        46*        130*      89
    2   krish       50         140       91
    4   jack        60         160       83
    2   amit        15         35        76
    3   joy         30         16        69
* denotes added values

我试过这样:

final = pd.concat([df2, df1]).add(df1['buy_qty','buy_val'],df2['buy_qty','buy_val']).drop_duplicates(subset=["CONTRACT"]).reset_index(drop=True)

但它不能正常工作。

任何人都可以提出更好的方法吗?

您之前的问题不同,在这里您必须groupby ,因为您想在列上aggregate一些值:

  • buy_qtysum
  • buy_valsum
  • factorfirst *

* first是因为您想保留 df2 的值,这是pd.concat上的第一个数据帧。

out = (pd.concat([df2, df1]).groupby('CONTRACT', as_index=False)
         .agg({'buy_qty': 'sum', 'buy_val': 'sum', 'factor': 'first'})
print(out)

# Output
  CONTRACT  buy_qty  buy_val  factor
0      Tom       25      115      67
1     amit       15       35      76
2     jack       60      160      83
3      joy       30       16      69
4    krish       50      140      91
5     nick       46      130      89

您可以使用addfill_value=0

(df1
 .set_index('CONTRACT')
 .add(df2.set_index('CONTRACT'), fill_value=0)
 .reset_index()
)

输出:

  CONTRACT  buy_qty  buy_val  factor
0      Tom     25.0    115.0   163.0
1     amit     15.0     35.0    76.0
2     jack     60.0    160.0    83.0
3      joy     30.0     16.0    69.0
4    krish     50.0    140.0    91.0
5     nick     46.0    130.0   182.0

尝试:

df3=pd.concat([df1,df2])
df3.groupby('CONTRACT').sum()

结果为:

    buy_qty     buy_val     factor
CONTRACT            
Tom     40  200     30
amit    50  140     25
jack    60  160     30
joy     60  160     30
krish   50  140     25
nick    80  240     40

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM