Pandas:根据条件删除多行

2024-06-16 10:23:49 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是我拥有的pandasdataframe的子集,我正试图基于某些条件删除多行。你知道吗

  code1 code2 grp1 grp2  dist_km
0  M001  M002  AAA  AAA      112
1  M001  M003  AAA  IHH      275
2  M002  M005  AAA  XXY      150
3  M002  M004  AAA  AAA       65
4  M003  M443  IHH  GRR       50
5  M003  M667  IHH  IHH      647
6  M003  M664  IHH  FFG      336

所以我只想保留grp1与每个code1grp2相同的行,但是只保留dist_km是特定code1的最小值的行。你知道吗

对于上面的示例,只保留以下行:

  code1 code2 grp1 grp2  dist_km
0  M001  M002  AAA  AAA      112
3  M002  M004  AAA  AAA       65

最简单的方法是什么?你知道吗


Tags: dist子集kmaaam001正试图pandasdataframecode2
3条回答

如果不存在创建临时数据帧的问题,则可以尝试使用transform

tmp = df[df.groupby('code1')['dist_km'].transform('min') == df['dist_km']]
df1 = tmp[tmp['grp1'] == tmp['grp2']]

或者您也可以尝试:

new_df = df.loc[df.groupby('code1')['dist_km'].idxmin()][df['grp1']==df['grp2']]

不需要groupby使用sort_valuesdrop_duplicates

df.sort_values('dist_km').drop_duplicates('code1').query('grp1==grp2')
  code1 code2 grp1 grp2  dist_km
3  M002  M004  AAA  AAA       65
0  M001  M002  AAA  AAA      112

使用两个条件

df.loc[(df['dist_km'] == df.groupby('code1')['dist_km'].transform('min')) & (df['grp1'] == df['grp2'])]

    code1   code2   grp1    grp2    dist_km
0   M001    M002    AAA     AAA     112
3   M002    M004    AAA     AAA     65

相关问题 更多 >