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

如何按列分组DataFrame:合并字符串列并求和数值列

解决按ZIP Code分组合并字符串列并求和的问题

我完全懂你现在的困扰——分组时不同列需要不同的处理逻辑,既要合并字符串列,又要求和数值列,还得保留每个ZIP对应的唯一信息。下面就针对你的需求给出具体的解决方案:

步骤1:还原示例数据

先把你的原始数据转换成可测试的DataFrame:

import pandas as pd

# 原始数据
data = {
    'ID': [100, 101, 102, 103, 104, 105],
    'Name': ['Muffin', 'Cake', 'Donut', 'Milk', 'Cookies', 'Candy'],
    'City': ['Parkwoods', 'Victoria Village', 'Parkwoods', 'Victoria Village', 'Wharf', 'Wharf'],
    'ZIP': [99101, 12512, 99101, 12512, 44101, 44101],
    'LAT': [48, 41, 48, 41, 41, 41],
    'LNG': [117, 74, 117, 74, 81, 81],
    'Sum1': [100, 250, 150, 75, 25, 115]
}

df = pd.DataFrame(data)

步骤2:用groupby+agg实现多列自定义聚合

核心是给每个列指定对应的处理逻辑:

  • ID和Name:用逗号连接同组的字符串(注意ID是数值类型,需要先转成字符串)
  • City、LAT、LNG:每个ZIP对应唯一值,直接取组内第一个值即可
  • Sum1:对同组数值求和

代码如下:

# 分组聚合
result = df.groupby('ZIP').agg(
    ID=('ID', lambda x: ', '.join(map(str, x))),
    Name=('Name', ', '.join),
    City=('City', 'first'),
    LAT=('LAT', 'first'),
    LNG=('LNG', 'first'),
    Sum1=('Sum1', 'sum')
).reset_index()

# 调整列顺序和你期望的输出一致
result = result[['ZIP', 'ID', 'Name', 'City', 'LAT', 'LNG', 'Sum1']]

步骤3:查看最终结果

运行代码后,得到的result就是你想要的格式:

ZIP         ID             Name              City  LAT  LNG  Sum1
0  12512  101, 103        Cake, Milk  Victoria Village   41   74   325
1  44101  104, 105    Cookies, Candy             Wharf   41   81   140
2  99101  100, 102     Muffin, Donut         Parkwoods   48  117   250

小补充

  • 如果你的ID列本来就是字符串类型,可以去掉map(str, x),直接用', '.join(x)
  • 对于City这类唯一值列,除了first(),用last()或者unique()[0]也能得到相同结果,选你习惯的就行
  • 要是以后遇到ZIP对应多个不同City的情况,可以根据实际需求调整逻辑(比如合并字符串或者抛出提示)

内容的提问来源于stack exchange,提问作者Jurassic_Question

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:50:29