如何按列分组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
相关产品推荐
相关产品推荐

