Python列表移除float类型nan值,市场篮子分析数据预处理问题
可行解决方案
方案1:DataFrame阶段直接处理(更高效,推荐)
不需要先转成带空值的列表再过滤,直接在DataFrame操作时就对每行做空值过滤,一步得到目标结果:
import pandas as pd # 你之前的空行删除逻辑保留 df.dropna(subset = ["Presc01"], inplace=True) df.index = range(len(df)) # 直接对每行过滤空值后转嵌套列表 prescriptions = df.apply(lambda row: row.dropna().tolist(), axis=1).tolist()
执行后得到的prescriptions每个子列表都已经自动剔除了所有空值,不需要额外处理。
方案2:对已生成的带空值列表做过滤
如果你已经生成了带nan的嵌套列表,用pd.isnull()做判断即可,该方法兼容字符串、float等多种类型,不会报错:
import pandas as pd filtered_prescriptions = [ [item for item in row if not pd.isnull(item)] for row in prescriptions ]
如果你的场景可能混入字符串形式的'nan',可以叠加一层判断确保万无一失:
filtered_prescriptions = [ [item for item in row if not pd.isnull(item) and str(item).lower() != 'nan'] for row in prescriptions ]
之前方法失效原因说明
np.isnan()失效:该方法仅支持数值类型输入,你列表中混合了字符串类型的药名,传入字符串会直接抛出异常,无法完成判断x != 'nan'失效:你列表中的nan是float类型的原生空值,不是字符串格式的'nan',字符串匹配自然无效- 如果你使用
x == x的逻辑没有生效,大概率是遍历逻辑错误,没有逐行遍历嵌套列表的每个元素
内容的提问来源于stack exchange,提问作者TNM
相关产品推荐
相关产品推荐

