繁体   English   中英

在 Pandas DataFrame 中找到两个匹配的行来计算值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM