Pandas字符串列非NaN值变量递增失效问题排查
问题分析
你的第二个if语句失效的核心原因是对NaN值的处理错误:当列值为NaN时,str(row["Service Médical "])会返回字符串"nan"而非空字符串"",这会导致条件str(...) != ""在值为NaN时误判为True;而如果列值是空字符串"",该条件又会误判为False,完全不符合你“值不为NaN时递增”的需求。
此外,直接通过row对象修改值的方式在apply中并非最优实现,还容易出现隐式错误。
修复后的逐行处理版本
import pandas as pd def indicateur_iov2(row): # 初始化IOV2为指定数值列的求和结果 row["IOV2"] = ( row["Bon alimentaire"] + row["Bon Hygiène"] + row["Ticket Hammam / Pour les personnes en rue "] + row["Ticket Restaurant / Pour les personnes en rue "] + row["Kits cuisine / Pour les personnes avec un hébergement"] ) # 检查Kit couchage列值是否为"Oui" if row["Kit couchage / Pour les personnes avec un hébergement"] == "Oui": row["IOV2"] += 1.0 # 正确判断Service Médical列不为NaN if pd.notna(row["Service Médical "]): row["IOV2"] += 1.0 # 正确判断Service Psychosociale列不为NaN if pd.notna(row["Service Psychosociale "]): row["IOV2"] += 1.0 return row["IOV2"]
如果你的实际需求是值不为NaN且非空字符串时才递增,可将判断条件调整为:
if pd.notna(row["Service Médical "]) and row["Service Médical "] != "": row["IOV2"] += 1.0
更高效的矢量化实现(推荐)
使用Pandas的矢量化操作替代apply,速度更快且代码更简洁,尤其适合大数据集:
# 初始化IOV2为指定数值列的求和结果 df["IOV2"] = ( df["Bon alimentaire"] + df["Bon Hygiène"] + df["Ticket Hammam / Pour les personnes en rue "] + df["Ticket Restaurant / Pour les personnes en rue "] + df["Kits cuisine / Pour les personnes avec un hébergement"] ) # 针对Kit couchage列的条件递增 df.loc[df["Kit couchage / Pour les personnes avec un hébergement"] == "Oui", "IOV2"] += 1.0 # 针对Service Médical列不为NaN的条件递增 df.loc[pd.notna(df["Service Médical "]), "IOV2"] += 1.0 # 针对Service Psychosociale列不为NaN的条件递增 df.loc[pd.notna(df["Service Psychosociale "]), "IOV2"] += 1.0
额外注意事项
- 核对列名一致性:你的代码中部分列名带有末尾空格(如
"Service Médical "),需确保DataFrame中的实际列名与代码完全匹配,否则会因取到NaN值导致条件判断失效。 - 确认数值列类型:确保
Bon alimentaire等列是int/float类型,否则求和操作会变成字符串拼接而非数值相加,引发计算错误。
内容的提问来源于stack exchange,提问作者Ismail Louassini
相关产品推荐
相关产品推荐

