如何将稀疏DataFrame中的非空值提取为单列?
更简洁高效的实现方案
直接借助pandas的原生向量化操作替代手动循环,代码更简洁且性能更优:
import pandas as pd list1 = ["x1","x2","?","?","?","?"] list2 = ["?","?","y1","y2","?","?"] list3 = ["?","?","?","?","z1","z2"] df_sparse = pd.DataFrame({"A":list1,"B":list2,"C":list3}) # 提取所有非"?"的值并转为列表 non_null_values = df_sparse.replace("?", pd.NA).stack().tolist() # 赋值给新列D,自动匹配原DataFrame行数 df_sparse["D"] = non_null_values display(df_sparse)
方案细节说明
replace("?", pd.NA):把自定义空值"?"转换为pandas标准缺失值标记,便于后续自动过滤stack():将列维度的数据转成行维度,同时自动剔除缺失值,得到包含所有非空值的Seriestolist():将Series转换为列表,直接赋值给新列即可完成对齐(本例中非空值数量恰好等于原DataFrame行数,完美匹配)
对比原方案的优势
- 完全避免手动循环和列表推导,代码逻辑更直观
- 利用pandas内置优化的向量化操作,处理大规模数据集时性能显著优于手动循环
- 代码行数更少,可读性更强
另一种等价实现方式(用melt筛选):
non_null_values = df_sparse.melt(value_name="D").query("D != '?'")["D"].tolist() df_sparse["D"] = non_null_values
内容的提问来源于stack exchange,提问作者Shck Tchamna
相关产品推荐
相关产品推荐

