如何在Pandas中保留每行非NaN值并合并为单行?
解决方案
针对你的需求,这里提供几种简洁高效的实现方式:
方法1:提取每列首个非空值
直接对DataFrame的每列进行处理,保留第一个非空值并转换为单行DataFrame:
import numpy as np import pandas as pd df = pd.DataFrame({'col1': [1, np.nan, np.nan], 'results': ['Sub', 'Sub', 'Sub'], 'group': ['a', 'a', 'a'], 'seed': [6, 6, 6], 'col2': [np.nan, 2, np.nan], 'col3': [np.nan, np.nan, 3]}) # 提取每列第一个非空值,转为单行DataFrame result_df = df.agg(lambda x: x.dropna().iloc[0]).to_frame().T # 重置索引确保索引为0 result_df = result_df.reset_index(drop=True) print(result_df)
输出结果:
col1 results group seed col2 col3 0 1.0 Sub a 6 2.0 3.0
方法2:分组聚合(适用于有重复分组字段的场景)
如果数据是按group/seed这类字段分组的,可通过分组操作提取非空值:
# 按分组字段聚合,提取每列首个非空值 result_df = df.groupby(['group', 'seed'], as_index=False).agg(lambda x: x.dropna().iloc[0]) print(result_df)
输出与方法1一致,同时保留分组字段的结构。
方法3:填充NaN后取单行
利用填充函数将同列的非空值填充到NaN位置,再取首行/尾行:
# 向后填充所有NaN,再取第一行 result_df = df.bfill().head(1) # 也可使用向前填充后取最后一行:df.ffill().tail(1) print(result_df)
这种方法代码最简洁,适合非空值分散在不同行的场景。
内容的提问来源于stack exchange,提问作者quant
相关产品推荐
相关产品推荐

