如何将Pandas DataFrame列转为str类型且保留空值?
Pandas 保留NaN的同时将列转为Object类型(非NaN元素为字符串)
问题原因
- 使用
astype(str)会把np.nan直接转为字符串'NaN',导致空值统计为0; - 用
lambda x: np.nan if x is np.nan else str(x)失效,是因为Pandas中部分空值(如pd.NA)或特殊场景下,is运算符无法精准匹配np.nan。
可行解决方案
方案1:astype(str) + where 快速还原NaN
先将所有元素转字符串,再把原空值位置重新设为np.nan:
import pandas as pd import numpy as np df = pd.DataFrame({'column_original': [1, 2, np.nan, 6, 8, np.nan]}) df['column_object'] = df['column_original'].astype(str).where(df['column_original'].notna(), np.nan) # 验证:空值数量=2,列类型为object print(df['column_object'].isna().sum()) print(df['column_object'].dtype)
方案2:apply + pd.isna 精准判断空值
用pd.isna()替代x is np.nan,覆盖所有空值类型的判断:
df['column_object'] = df['column_original'].apply(lambda x: np.nan if pd.isna(x) else str(x)) # 验证结果 print(df['column_object'].isna().sum()) print(df['column_object'].dtype)
方案3:处理混合类型列(可选)
如果原列同时包含字符串、数值和空值,先统一转为数值型再处理:
# 非数值内容转为NaN,统一列类型 df['column_original'] = pd.to_numeric(df['column_original'], errors='coerce') # 再转字符串+保留NaN df['column_object'] = df['column_original'].apply(lambda x: np.nan if pd.isna(x) else str(x))
内容的提问来源于stack exchange,提问作者Ricardo Tompson Fioravante
相关产品推荐
相关产品推荐

