You need to enable JavaScript to run this app. 如何按列名对Pandas DataFrame列分组并将同组列合并为单列
优惠活动
大模型
产品
解决方案
定价
更多

如何按列名对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 07:33:04