Python中用.loc筛选末尾为.99的float列数据的问题
当然可以直接在.loc里实现所有判断逻辑,不用临时列。你之前的写法失效是因为错误地把整个Series转成了单一字符串,而不是逐元素处理。下面是两种可行的实现方式:
方法1:通过字符串逐元素匹配
利用Pandas Series的.str属性对每个元素单独转字符串并判断结尾:
filtered_df = df_official.loc[ (df_official['price_duration_days'] >= 7) & (df_official['shop'].isin(official_stores)) & (df_official['Days From Release'] <= 3) & (df_official['y'].astype(str).str.endswith('.99')) ]
方法2:通过数值计算判断(更可靠)
浮点转字符串可能遇到科学计数法的问题,用数值运算判断小数部分更稳妥,注意用np.isclose避免浮点数精度误差:
import numpy as np filtered_df = df_official.loc[ (df_official['price_duration_days'] >= 7) & (df_official['shop'].isin(official_stores)) & (df_official['Days From Release'] <= 3) & (np.isclose(df_official['y'] - np.floor(df_official['y']), 0.99)) ]
为什么之前的写法不行?
str(df_official.y)会把整个Series对象转换成一个描述性的字符串(比如类似"0 19.99\n1 25.50\nName: y, dtype: float64"),取[-3:]得到的是这个长字符串的最后三个字符,不是每个元素的小数部分,自然无法生成正确的布尔筛选数组,进而引发索引或键错误。
内容的提问来源于stack exchange,提问作者Prototype
相关产品推荐
相关产品推荐

