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)
应该知道怎么做,只是暂时想不起来了。
如果这些是简单的货币(美元)金额,您可以将十进制值转换为整数(为避免浮动比较,这可能会导致错误答案),然后进行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)