[英]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的货币。
这是一个使用groupby
和apply
和自定义函数来匹配和删除对的解决方案。
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.