在熊猫中只保留具有特定十进制值的行

Del*_*lto 2 python dataframe pandas

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

说我的数据框是-

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)
Run Code Online (Sandbox Code Playgroud)

带输出-

  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
Run Code Online (Sandbox Code Playgroud)

我只想保持价格以 0.99、.00 和 0.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
Run Code Online (Sandbox Code Playgroud)

应该知道怎么做,只是暂时想不起来了。

cs9*_*s95 6

如果这些是简单的货币(美元)金额,您可以将十进制值转换为整数(为避免浮动比较,这可能会导致错误答案),然后进行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
Run Code Online (Sandbox Code Playgroud)

通过我的测试,这是两者中更快的一个。


另一种选择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
Run Code Online (Sandbox Code Playgroud)