首页 > 解决方案 > 只保留熊猫中具有特定十进制值的行

问题描述

目前有一个大脑放屁,我不记得如何根据数字结尾的小数过滤掉数字。

说我的数据框是-

dic = {'product':['Bread','Milk','Eggs','Water','OJ','Cereal','Coffee',
                    'Apples','Banana','Muffin'],
       'price':[3.89,2.99,4.00,0.69,1.99,2.39,5.00,0.99,0.98,1.50]}
df = pd.DataFrame(dic)
print(df)

带输出-

  product  price
0   Bread   3.89
1    Milk   2.99
2    Eggs   4.00
3   Water   0.69
4      OJ   1.99
5  Cereal   2.39
6  Coffee   5.00
7  Apples   0.99
8  Banana   0.98
9  Muffin   1.50

而且我只想保留以 .99、.00 和 .50 结尾的价格

我想要的输出是-

  product  price
1    Milk   2.99
2    Eggs   4.00
4      OJ   1.99
6  Coffee   5.00
7  Apples   0.99
9  Muffin   1.50

应该知道怎么做,只是暂时不记得了。

标签: pythonpandasdataframe

解决方案


如果这些是简单的货币(美元)金额,您可以将十进制值转换为整数(为避免浮动比较,这些可能导致错误答案),然后进行isin检查:

df[df['price'].mul(100).mod(100).astype(int).isin([0, 50, 99])]

  product  price
1    Milk   2.99
2    Eggs   4.00
4      OJ   1.99
6  Coffee   5.00
7  Apples   0.99
9  Muffin   1.50

根据我的测试,这是两者中速度更快的一个。


另一个选项np.isclose

df[np.logical_or.reduce([
    np.isclose(df['price'].mod(1), d) for d in [0, .99, .5]])]

  product  price
1    Milk   2.99
2    Eggs   4.00
4      OJ   1.99
6  Coffee   5.00
7  Apples   0.99
9  Muffin   1.50

推荐阅读