[英]Find two matching rows in a Pandas DataFrame to calculate value
我想在 Pandas 数据框中为另一行找到匹配的行。 鉴于此示例框架:
name location type year area delta
0 building NY a 2019 650.3 ?
1 building NY b 2019 400.0 ?
2 park LA a 2017 890.7 ?
3 lake SF b 2007 142.2 ?
4 park LA b 2017 333.3 ?
...
每行都有一个匹配的行,其中所有值都相等 - 除了“类型”和“区域”。 例如,第 0 行和第 1 行匹配,第 2 行和第 4 行,...
我想以某种方式获得匹配的行; 并在它们的“delta”列中写出它们的面积之间的差异(例如,第 0 行的 |650.3 - 400.0| = 250.3)。
“delta”列尚不存在,但可以使用df["Delta"] = 0
轻松添加一个空列。 我只是不知道如何能够为所有行填充增量列。
我尝试使用df[name = 'building' & location = 'type' ... ~& type = 'a']
获取匹配的行; 但我无法编辑从中得到的结果。 也许我也不太明白什么时候拿到副本,什么时候参考。
我希望我的问题很清楚。 如果没有,我很乐意进一步解释。
非常感谢您的帮助!
IIUC,你想要groupby.transform
:
df['delta']=( df.groupby(df.columns.difference(['type','area']).tolist())
.transform('diff').abs() )
print(df)
name location type year area delta
0 building NY a 2019 650.3 NaN
1 building NY b 2019 400.0 250.3
2 park LA a 2017 890.7 NaN
3 lake SF b 2007 142.2 NaN
4 park LA b 2017 333.3 557.4
如果要在delta
列的两行中写入差异:
df['delta']=( df.groupby(df.columns.difference(['type','area']).tolist())
.transform(lambda x: x.diff().bfill()).abs() )
print(df)
name location type year area delta
0 building NY a 2019 650.3 250.3
1 building NY b 2019 400.0 250.3
2 park LA a 2017 890.7 557.4
3 lake SF b 2007 142.2 NaN
4 park LA b 2017 333.3 557.4
细节:
df.columns.difference(['type','area']).tolist()
#[*df.columns.difference(['type','area'])] or this
#['location', 'name', 'year'] #Output
merge
的解决方案:
df['other_type'] = np.where(df['type']=='a', 'b', 'a')
(df.merge(df,
left_on=['name','location', 'year', 'type'],
right_on=['name','location', 'year', 'other_type'],
suffixes=['','_r'])
.assign(delta=lambda x: x['area']-x['area_r'])
.drop(['area_r', 'other_type_r'], axis=1)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.