Python PANDAS如何删除dataframe中具有重复列值的所有行,如果行中的特定单元格是特定值

hfyxw5xn  于 2023-03-28  发布在  Python
关注(0)|答案(2)|浏览(141)

这个有点不同,我在任何地方都找不到它。即使是好的老ChatGPT也卡住了,所以问真实的的人类。
我有这样一个 Dataframe :
| oldVoucherId|价值购买|剩余值|
| --------------|--------------|--------------|
| 1|六十||
| 1||五十|
| 1||四十|
| 二|七十||
| 二||六十|
| 二||0|
| 五|五十||
| 五||四十五|
| 五||0|
| 三|四十||
| 三||0|
| 八|五十||
| 九|七十||
我希望Pandas删除任何行,共享一个凭证ID,有一个0值剩余。
所以完成后看起来像这样:
| oldVoucherId|价值购买|剩余值|
| --------------|--------------|--------------|
| 1||四十|
| 八||五十|
| 九||七十|
在这种情况下,代金券1仍然剩余40美元,并且代金券8和9从未使用过,因此它们也需要保留。
如果valueRemainging的条件设置为0,我如何才能让PANDAS删除共享相同凭证ID的那些行?
太感谢你了...
更新:此示例数据应该可以工作:

data = {'oldVoucherId': ['1', '1', '1', '2', '2', '2', '5', '5', '5', '3', '3', '8', '9'],
                    'valuePurchased': ['60','','','70','','','50','','','40','','50','70'],
                    'valueRemaining': ['','50','40','','60','0','','45','0','','0','','']}

            df = pd.DataFrame(data)
gz5pxeao

gz5pxeao1#

你没有提供数据框的方式,我可以很容易地创建它,并与它弄乱。所以这只是一个猜测。
我会执行groupby + filter操作

result = (
  df.groupby("oldVoucherId")
    .filter(lambda g: g["valueRemaining"].eq(0).any())
)
nx7onnlm

nx7onnlm2#

可以比较0字符串:

ids = df.loc[df['valueRemaining'].eq('0'), 'oldVoucherId']

另一种方法是转换为数字并比较0数字:

ids = df.loc[pd.to_numeric(df['valueRemaining'], errors='coerce').eq(0), 'oldVoucherId']
print (ids)
5     2
8     5
10    3
Name: oldVoucherId, dtype: object

然后,如果ids中不存在oldVoucherId,则通过boolean indexing使用Series.isin过滤所有oldVoucherId,并通过~反转掩码:

out = df[~df['oldVoucherId'].isin(ids)]
print (out)
   oldVoucherId valuePurchased valueRemaining
0             1             60            NaN
1             1            NaN             50
2             1            NaN             40
11            8             50            NaN
12            9             70            NaN

对于预期的输出,删除重复项并保留最后一个值:

out = out.drop_duplicates('oldVoucherId', keep='last')
print (out)
   oldVoucherId valuePurchased valueRemaining
2             1            NaN             40
11            8             50            NaN
12            9             70            NaN

valueRemaining中的缺失值替换为valuePurchased,并将NaN s设置为valuePurchased

out['valueRemaining'] = out['valueRemaining'].fillna(out['valuePurchased'])
out['valuePurchased'] = np.nan
print (out)
   oldVoucherId  valuePurchased valueRemaining
2             1             NaN             40
11            8             NaN             50
12            9             NaN             70

相关问题