繁体   English   中英

根据特定条件删除行

[英]drop rows based on specific conditions

这是df的一部分:

   NUMBER         MONEY
    12345           20
    12345          -20
    12345           20
    12345           20
    123456          10
    678910          7.6
    123457          3
    678910         -7.6

我想删除具有相同NUMBER但金额相反的行。

理想的结果如下:

    NUMBER         MONEY
    12345           20
    12345           20
    123456          10  
    123457          3

注意:这些条目不是一一对应的(我的意思是总数是一个奇数)。

例如,有四个条目是[Number] 12345。

其中三个[Money]是20,一个[Money]是-20。

我只想删除两个相反的[Money],并保留另外两个货币为20的货币。

这是一个使用groupbyapply和自定义函数来匹配和删除对的解决方案。

def remove_pairs(x):
    positive = x.loc[x['MONEY'] > 0].index.values
    negative = x.loc[x['MONEY'] < 0].index.values
    for i, j in zip(positive, negative):
        x = x.drop([i, j])
    return x

df['absvalues'] = df['MONEY'].abs()

dd = df.groupby(['NUMBER', 'absvalues']).apply(remove_pairs)
dd.reset_index(drop=True, inplace=True)
dd.drop('absvalues', axis=1, inplace=True)

添加绝对值为'MONEY' 'absvalue'列,以使用groupby进行双索引选择,然后自定义函数将成对的行groupby成对,以选择正数和负数。

最后两行只是进行一些清洁。 使用示例数据框,最终结果dd为:

   NUMBER  MONEY
0   12345   20.0
1   12345   20.0
2  123456   10.0
3  123457    3.0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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