如何使用Pandas选择性dropna,使DataFrame各列独立去除NaN?
解决DataFrame中单独处理每列NaN值的问题
我明白你的需求了——你不想因为某一列存在NaN就删除整行,而是希望把两列的有效数据尽量按顺序对应起来,多余的行保留对应列的空值。下面是针对这个需求的具体解决方案:
1. 先还原你的示例DataFrame
首先我们用代码创建你提供的示例数据:
import pandas as pd import numpy as np data = { 'Advertising': [np.nan, 71.0, 65.0, 14.0, 76.0, np.nan, np.nan, 73.0, 85.0, 17.0, np.nan], 'No Advertising': [7.0, np.nan, np.nan, np.nan, np.nan, 36.0, 9.0, np.nan, np.nan, np.nan, 103.0] } df = pd.DataFrame(data)
2. 核心解决方案:提取每列有效数据后合并
我们可以分别提取两列的非NaN值,重置它们的索引后再合并,这样就能让两列的有效数据一一对应,直到其中一列的数据耗尽,剩下的行另一列自动填充NaN:
# 提取每列的非NaN值并重置索引,确保从0开始连续编号 adv_valid = df['Advertising'].dropna().reset_index(drop=True) no_adv_valid = df['No Advertising'].dropna().reset_index(drop=True) # 按列合并两个有效数据序列 result_df = pd.concat([adv_valid, no_adv_valid], axis=1)
运行这段代码后,result_df的内容就是你想要的结果:
Advertising No Advertising 0 71.0 7.0 1 65.0 36.0 2 14.0 9.0 3 76.0 103.0 4 73.0 NaN 5 85.0 NaN 6 17.0 NaN
3. 可选:将NaN显示为空字符串
如果你希望把NaN显示成空字符串(和你给出的期望输出格式完全一致),可以用fillna('')调整显示效果(注意这会把数值列转为object类型):
display_df = result_df.fillna('') print(display_df)
输出效果:
Advertising No Advertising 0 71.0 7.0 1 65.0 36.0 2 14.0 9.0 3 76.0 103.0 4 73.0 5 85.0 6 17.0
这个方法的优势在于完全保留了每列的所有有效数据,不会因为某一列的缺失值丢失另一列的有用信息,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者moe_95
相关产品推荐
相关产品推荐

