You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除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值(替代删除)
    要是不想丢失数据,用填充方式处理:
    • 固定值填充:df.fillna(0)(示例用0,可替换为其他常数)
    • 统计值填充:数值列可用均值df.fillna(df.mean())或中位数df.fillna(df.median())填充
    • 相邻值填充:用前一行有效值填充df.fillna(method='ffill'),或后一行有效值填充df.fillna(method='bfill')

2. 合并第5列及之后列并排除NaN的逻辑确认与优化

逻辑验证

你的代码逻辑完全正确:

  1. df3.columns[5:] 选中第5列及之后的所有列(注意pandas列索引从0开始,如果你是按1开始计数的第5列,应该用df3.columns[4:],根据实际数据调整)
  2. apply(..., axis=1) 对每一行执行自定义逻辑
  3. x.dropna() 过滤当前行中的NaN值
  4. ','.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 12:15:41