如何添加带有另一个数据框的数据框并添加基于列的公共列值?
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 的所有合同值和 df1 的 不常见 合同值,通过添加公共合同的 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
我的第一个数据框:
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 的所有合同值和 df1 的 不常见 合同值,通过添加公共合同的 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