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)
)