![](/img/trans.png)
[英]how to add a dataframe with another dataframe and updated common values based on a column
[英]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_qty
: sum
buy_val
: sum
factor
: first
* * 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
您可以使用add
和fill_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.