如何移除DataFrame中所有类型NaN?并实现多列合并排除NaN
Pandas DataFrame 问题解答
1. 移除DataFrame中的所有NaN值
处理NaN通常分两种场景,按需选择:
- 删除含NaN的行/列
- 删除任何包含NaN的行:
df.dropna(axis=0, how='any');如果只想删除全为NaN的行,把how参数改成'all' - 删除任何包含NaN的列:
df.dropna(axis=1, how='any');同理,how='all'仅删除全为NaN的列
- 删除任何包含NaN的行:
- 填充NaN值(替代删除)
要是不想丢失数据,用填充方式处理:- 固定值填充:
df.fillna(0)(示例用0,可替换为其他常数) - 统计值填充:数值列可用均值
df.fillna(df.mean())或中位数df.fillna(df.median())填充 - 相邻值填充:用前一行有效值填充
df.fillna(method='ffill'),或后一行有效值填充df.fillna(method='bfill')
- 固定值填充:
2. 合并第5列及之后列并排除NaN的逻辑确认与优化
逻辑验证
你的代码逻辑完全正确:
df3.columns[5:]选中第5列及之后的所有列(注意pandas列索引从0开始,如果你是按1开始计数的第5列,应该用df3.columns[4:],根据实际数据调整)apply(..., axis=1)对每一行执行自定义逻辑x.dropna()过滤当前行中的NaN值','.join(...)将剩余非NaN值用逗号拼接成字符串
最终生成的Generation列就是每行目标列中非NaN值的逗号分隔字符串,完全符合需求。
优化方案
当数据量较大时,apply的循环式处理效率偏低,推荐以下更高效的方法:
- 方法一:stack + groupby 向量化处理
# 选中目标列,按行堆叠后去除NaN,再按行分组拼接 stacked_data = df3.iloc[:, 5:].stack().groupby(level=0).apply(','.join) # 重新索引匹配原DataFrame,空值填充为空字符串 df3['Generation'] = stacked_data.reindex(df3.index, fill_value='')
- 方法二:agg 替代 apply
df3['Generation'] = df3.iloc[:, 5:].agg(lambda x: ','.join(x.dropna()), axis=1)
逻辑和你的代码一致,但agg在内部实现上比apply更高效,尤其是处理大数据集时。
另外,若目标列的列名固定,直接指定列名列表(如df3[['ColName5', 'ColName6', ...]])代替iloc[:,5:],代码可读性会更好。
内容的提问来源于stack exchange,提问作者Dharmesh
相关产品推荐
相关产品推荐

