You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中按ID合并DataFrame行:合并同ID的多值列并保留公共属性

Python中按ID合并DataFrame行:合并同ID的多值列并保留公共属性

嗨,你找对方向啦!用groupby完全能实现这个需求,我给你一步步拆解怎么操作:

首先咱们先把你提供的示例数据还原成DataFrame,方便测试:

import pandas as pd

# 构造原始数据
data = {
    'ID': [1, 1, 2, 3, 1],
    'type1': ['dog', 'dog', 'cat', 'mouse', 'dog'],
    'type2': ['yellow', 'yellow', 'brown', 'blue', 'yellow'],
    'value1': [1, 5, 1, 1, 1],
    'value2': [2, 6, 1, 1, 2],
    'value3': [3, 7, 1, 1, 3]
}
df = pd.DataFrame(data)

接下来核心思路是:按ID分组后,对不同类型的列用不同的聚合逻辑:

  • 对于type1、type2这类同ID下值完全相同的列,直接取组内第一个值就行(或者用max()/min(),结果都一样)
  • 对于value1/value2/value3这类需要合并的列,咱们自定义一个函数,把组内所有行的这些值都提取出来,拼成空格分隔的字符串

直接上实现代码:

# 自定义聚合函数:把组内所有value列的值扁平化成一个列表,再转成空格分隔的字符串
def combine_values(group):
    # 提取所有value列的值并扁平化
    all_values = group[['value1', 'value2', 'value3']].values.flatten().tolist()
    # 转成字符串(注意要把数字转成字符串再拼接)
    return ' '.join(map(str, all_values))

# 按ID分组并聚合
result_df = df.groupby('ID').agg(
    type1=('type1', 'first'),  # 取同ID下的第一个type1值(所有值都一样)
    type2=('type2', 'first'),
    value=('value1', combine_values)  # 用自定义函数处理value相关列
).reset_index()  # 把ID从索引变回普通列

运行后打印result_df,就能得到你想要的输出:

ID  type1   type2             value
0   1    dog  yellow  1 2 3 5 6 7 1 2 3
1   2    cat   brown        1 1 1
2   3  mouse    blue        1 1 1

如果你的DataFrame里value开头的列不止3个,还可以写个通用版,自动识别所有value列,不用硬写列名:

# 自动筛选所有以value开头的列
value_cols = [col for col in df.columns if col.startswith('value')]

def combine_values_general(group):
    all_values = group[value_cols].values.flatten().tolist()
    return ' '.join(map(str, all_values))

# 通用版聚合
result_df_general = df.groupby('ID').agg(
    type1=('type1', 'first'),
    type2=('type2', 'first'),
    value=(value_cols[0], combine_values_general)
).reset_index()

这样不管你有多少个value列,都能自动合并啦!

备注:内容来源于stack exchange,提问作者Hupatin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 13:39:35