Python 在数据帧中查找两个匹配行以计算值
我想为数据帧中的另一行查找匹配行。给定此示例框架:Python 在数据帧中查找两个匹配行以计算值,python,pandas,Python,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 ?
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
轻松添加空列。我只是不知道如何填充所有行的delta列
我尝试使用df[name='building'&location='type'.~&type='a']
获取匹配行;但是我不能编辑我从中得到的结果。也许我也不太明白我什么时候得到一份副本,什么时候得到一份推荐信
我希望我的问题很清楚。如果没有,我很乐意进一步解释
非常感谢你的帮助 IIUC,您需要:
如果要在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
IIUC,你想要:
如果要在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
使用
合并的解决方案:
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)
)
使用合并的解决方案:
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)
)