如何使用Pandas将问卷多列稀疏问题数据合并为单列
Pandas多列稀疏数据按行合并为单列实现方案
场景说明
待处理的问卷数据为多列存储结构,每行仅单个列存在有效值,其余位置为空,需要将所有非空值按原行顺序提取,合并为单列输出。
样例输入数据结构:
| Q1 | Q2 | Q3 | Q4 |
|---|---|---|---|
| 2 | |||
| 1 | |||
| 3 | |||
| 2 | |||
| 4 |
期望输出为单列Q,值依次为2、1、3、2、4。
实现步骤
首先构造测试数据集,空值统一使用np.nan标识:
import pandas as pd import numpy as np df = pd.DataFrame({ 'Q1': [np.nan, 1, np.nan, np.nan, np.nan], 'Q2': [2, np.nan, np.nan, 2, np.nan], 'Q3': [np.nan, np.nan, 3, np.nan, np.nan], 'Q4': [np.nan, np.nan, np.nan, np.nan, 4] })
如果你的原始数据空值是空字符串'',先执行一次替换:
df = df.replace('', np.nan)
方法1:按行取首个非空值(性能最优,适配当前单非空场景)
因为每行仅存在1个有效值,沿行方向做向前填充后,最后一列即为每行的非空值,直接提取即可:
result = pd.DataFrame({'Q': df.ffill(axis=1).iloc[:, -1]})
输出结果:
Q 0 2.0 1 1.0 2 3.0 3 2.0 4 4.0
如果需要整数格式,追加.astype(int)转换类型即可。
方法2:stack自动剔除空值(兼容性更强)
stack()方法默认会丢弃所有空值,将DataFrame展平为序列,在当前单非空场景下,展平后的顺序和原行顺序完全一致,不需要额外排序:
result = df.stack().reset_index(drop=True).to_frame(name='Q')
该方法即使后续数据出现单行多非空的情况,也能按列顺序依次展开值,适配性更好。
内容的提问来源于stack exchange,提问作者coelidonum
相关产品推荐
相关产品推荐

