Pandas如何将3个含NaN的列合并为仅保留有效字符串的单列
实现方案
你提到的场景下每行在指定三列中仅有一个非NaN字符串,直接按行提取唯一非空值即可,以下是可直接运行的完整代码:
步骤1:构造示例测试数据
import pandas as pd import numpy as np # 按照你给出的结构构造DataFrame data = { 'Q3_4_4': { 'R_00RfS8OP6QrTNtL': np.nan, 'R_3JtmbtdPjxXZAwA': np.nan, 'R_3G2sp6TEXZmf2KI': 'hello' }, 'Q3_4_5': { 'R_00RfS8OP6QrTNtL': 'hi', 'R_3JtmbtdPjxXZAwA': np.nan, 'R_3G2sp6TEXZmf2KI': np.nan }, 'Q3_4_6': { 'R_00RfS8OP6QrTNtL': np.nan, 'R_3JtmbtdPjxXZAwA': 'bye', 'R_3G2sp6TEXZmf2KI': np.nan } } df = pd.DataFrame(data)
步骤2:合并列生成Q3_4
提供两种常用实现,可根据场景选择:
- 性能最优方案(适合大数据量,利用按行向后填充取第一个非空值)
df['Q3_4'] = df[['Q3_4_4', 'Q3_4_5', 'Q3_4_6']].bfill(axis=1).iloc[:, 0]
- 可读性最优方案(语义明确,方便扩展规则)
df['Q3_4'] = df[['Q3_4_4', 'Q3_4_5', 'Q3_4_6']].apply(lambda x: x.dropna().iloc[0], axis=1)
特殊场景适配
如果你的实际数据存在某行多列同时有非空字符串的情况,需要拼接所有非空值的话,可以将上述apply内的逻辑替换为:
lambda x: ''.join(x.dropna())
运行后生成的Q3_4列完全符合你要求的输出:第一行hi、第二行bye、第三行hello。
内容的提问来源于stack exchange,提问作者fredooms
相关产品推荐
相关产品推荐

