对DataFrame的AGE列取整时如何处理字符串值?
解决DataFrame混合类型列的小数保留问题
你遇到的问题很典型——当列里同时存在数值和字符串类型时,直接调用round()会因为字符串无法进行浮点运算而报错。这里有几种简单高效的处理方法,能帮你保留数值的三位小数,同时原封不动保留NOT KNOWN字符串:
方法1:使用pd.to_numeric + fillna(最简洁)
这个方法先把非数值内容转为NaN,完成小数保留后再把NaN替换回目标字符串,代码非常简洁:
import pandas as pd # 对AGE列进行处理 df['AGE'] = pd.to_numeric(df['AGE'], errors='coerce').round(3).fillna('NOT KNOWN')
- 原理拆解:
pd.to_numeric(..., errors='coerce')会把无法转为数值的内容(比如NOT KNOWN)转为NaN;.round(3)对数值型数据保留三位小数;.fillna('NOT KNOWN')把之前转成NaN的字符串恢复回来。
方法2:使用布尔掩码精准筛选处理
如果你需要更精准地控制处理范围(比如列里有多种不同字符串标记),可以用掩码筛选出需要处理的行:
# 筛选出AGE不是"NOT KNOWN"的行 mask = df['AGE'] != 'NOT KNOWN' # 对这些行的AGE转成float后保留三位小数 df.loc[mask, 'AGE'] = df.loc[mask, 'AGE'].astype(float).round(3)
这种方法只修改需要处理的数值行,不会影响其他字符串内容,适合复杂场景下的精准操作。
方法3:使用apply自定义逐元素逻辑
如果你喜欢更直观的逐元素处理方式,可以用apply配合lambda函数:
df['AGE'] = df['AGE'].apply(lambda x: round(x, 3) if isinstance(x, float) else x)
不过要注意,这种方法在数据量很大时效率会略低于前两种,小数据集使用完全没问题。
运行以上任意一种方法后,你的AGE列都会变成期望的格式:
DATE_OF_BIRTH AGE
0 1974-03-28 43.010
1 NOT KNOWN NOT KNOWN
2 1970-11-27 46.342
3 1974-05-09 42.894
4 1985-03-14 32.047
内容的提问来源于stack exchange,提问作者Stacey
相关产品推荐
相关产品推荐

