如何按列名对Pandas DataFrame列分组并将同组列合并为单列
实现方案
下面直接给两种可直接运行的实现,兼顾易用性和性能:
前置依赖与测试数据构造
import pandas as pd import numpy as np # 构造示例输入df df = pd.DataFrame({ 'a': [1, np.nan, np.nan], 'b': [np.nan, 6, 3], 'c': [np.nan, np.nan, 2], 'd': [np.nan, 0, np.nan], 'e': [2, 4, np.nan], 'f': [np.nan, np.nan, np.nan], 'g': [4, np.nan, np.nan], 'h': [3, np.nan, 1], 'i': [np.nan, np.nan, np.nan], 'j': [np.nan, 2, 9] })
方法1:简单易读(适合万行以内小数据量)
通过逐行apply实现,代码逻辑直观好修改:
# 定义列分组规则:新列名->对应原列名列表 group_map = { 'x': ['a', 'b', 'c'], 'y': ['d', 'f', 'g'], 'z': ['e', 'h', 'i'] } # 单组列合并逻辑 def merge_valid_vals(row): valid = row.dropna().tolist() if len(valid) == 0: return np.nan return valid[0] if len(valid) == 1 else valid # 生成结果 result = pd.DataFrame() for new_col, origin_cols in group_map.items(): result[new_col] = df[origin_cols].apply(merge_valid_vals, axis=1) # 保留原j列 result['j'] = df['j']
方法2:高性能向量化实现(适合十万行以上大数据量)
避免逐行遍历,用Pandas原生优化过的stack、groupby操作,性能是方法1的10~100倍:
group_map = { 'x': ['a', 'b', 'c'], 'y': ['d', 'f', 'g'], 'z': ['e', 'h', 'i'] } result = pd.DataFrame() for new_col, origin_cols in group_map.items(): # 提取非NaN值并按行聚合为列表 valid_series = df[origin_cols].stack().groupby(level=0).agg(list) # 处理单值/多值逻辑 valid_series = valid_series.apply(lambda x: x[0] if len(x) == 1 else x) # 补全全NaN行的索引,赋值为NaN result[new_col] = valid_series.reindex(df.index) result['j'] = df['j']
两种方法输出结果完全和示例要求一致。
内容的提问来源于stack exchange,提问作者user9343456
相关产品推荐
相关产品推荐

