处理含字符串与数值的DataFrame列时赋值报错的解决方法
报错原因
你写的代码里直接用if df['A']!='n.a.'判断整个Series,这在Pandas里行不通。因为df['A']!='n.a.'返回的是一个包含True/False的布尔Series,Pandas没法把一整组布尔值判定为单一的“真”或“假”,所以会抛出那个真值不明确的错误。普通的if语句只能处理单个值,不能直接套在Series上。
解决方法
给你三种靠谱的实现方式,按需选择:
方法1:用numpy.where(推荐,处理大数据更快)
先把条件写清楚,批量赋值:
import numpy as np import pandas as pd date = "15/2/2022" # 构造条件:要么是"n.a",要么转成数值后小于1 condition = (df['A'] == 'n.a') | (pd.to_numeric(df['A'], errors='coerce') < 1) # 满足条件就设为date,否则设为"n.a." df['New col'] = np.where(condition, date, 'n.a.')
这里用pd.to_numeric把A列转成数值,转失败的"n.a"会变成NaN,不过我们已经单独把"n.a"的情况放进条件里了,逻辑不会出错。
方法2:用df.loc批量修改
先初始化新列,再定位符合条件的行修改:
import pandas as pd date = "15/2/2022" # 先把新列全设为"n.a." df['New col'] = 'n.a.' # 找出需要改的行 mask = (df['A'] == 'n.a') | (pd.to_numeric(df['A'], errors='coerce') < 1) # 给这些行赋值date df.loc[mask, 'New col'] = date
方法3:用apply逐行处理(适合逻辑简单的小数据)
给每个元素单独判断:
date = "15/2/2022" def set_new_col(val): if val == 'n.a': return date # 尝试转成数值判断 try: num = float(val) if num < 1: return date elif num == 1: return 'n.a.' # 遇到其他意外值也返回date(可根据需求调整) except: return date df['New col'] = df['A'].apply(set_new_col)
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

