我想在数据帧上执行条件减法(显示为第一张图片)。
基本上,这就是我想要做的事情:
由于第一行有食物'并且'我'而第三排有食物'并且'你'你从第一行中减去第三行的col1和col2的值 (300 - 600 = -300,和200 - 500 = -300)。
由于第二排有衣服'并且'我'第四排有衣服'并且'你'你从第二行中减去第四行的col1和col2的值(500 - 200 = 300和600 - 700 = -100)。
如何使用Pandas数据框实现此功能?
答案 0 :(得分:2)
你可以使用pd.concat
,groupby
这样做,并利用Pandas基于索引的数据内在对齐:
输入df:
df = pd.DataFrame({'type1':['food','clothing','food','clothing'],'type2':['me','me','you','you'],'col1':[300,500,600,200],'col2':[200,600,500,700]})
pd.concat([df.set_index(['type1','type2'])
.groupby('type1')
.apply(lambda x: x.iloc[0]-x.iloc[1])
.assign(type2='us')
.set_index('type2', append=True),
df.set_index(['type1','type2'])]).reset_index()
对于年龄大于0.20.0的熊猫
pd.concat([df.set_index(['type1','type2'])
.groupby(level=0)
.apply(lambda x: x.iloc[0]-x.iloc[1])
.assign(type2='us')
.set_index('type2', append=True),
df.set_index(['type1','type2'])]).sort_index(level=[1,0]).reset_index()
输出:
type1 type2 col1 col2
0 clothing us 300 -100
1 food us -300 -300
2 food me 300 200
3 clothing me 500 600
4 food you 600 500
5 clothing you 200 700
答案 1 :(得分:1)
使用eval
df \
.set_index(['type2', 'type1']).unstack().T \
.eval('us = me - you', inplace=False) \
.T.stack().reset_index()
type2 type1 col1 col2
0 me clothing 500 600
1 me food 300 200
2 you clothing 200 700
3 you food 600 500
4 us clothing 300 -100
5 us food -300 -300