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

Pandas DataFrame分组聚合:行转列并合并同组数据

Pandas行转列去重解决方案

问题描述

尝试在Pandas中将行转换为不同列,现有代码按PARENT_PART和CITY分组统计数量后,通过循环添加城市列,但输出存在重复行。需求是:对每个重复的PARENT_PART保留一行,创建以CITY命名的计数列,合并同组行得到目标结果。

现有代码

d = {'PARENT_PART': ['KRC161262', 'KRC161262', 'KRC161833', 'KRC161834', 'KRC161834'], 'CITY': ['BARCELONA', 'MADRID', 'BARCELONA', 'BARCELONA', 'MADRID'], 'GOOD_OR_FAULTY': ['GOOD', 'GOOD', 'GOOD','GOOD','FAULT']}

df = pd.DataFrame(data=d)

grouped1 = df.groupby(['PARENT_PART', 'CITY']).size().reset_index(name='counts')

for index, row in grouped1.iterrows():    
    ciudad = row['CITY']    
    codigo = row['PARENT_PART']
    counts = grouped1.loc[(grouped1['PARENT_PART'] == codigo) & (grouped1['CITY'] == ciudad), 'counts'].values[0]
    df.loc[index, ciudad] = counts
print(df)

当前输出

PARENT_PART       CITY GOOD_OR_FAULTY  BARCELONA  MADRID
0   KRC161262  BARCELONA           GOOD        1.0     NaN
1   KRC161262     MADRID           GOOD        NaN     1.0
2   KRC161833  BARCELONA           GOOD        1.0     NaN
3   KRC161834  BARCELONA           GOOD        1.0     NaN
4   KRC161834     MADRID          FAULT        NaN     1.0

期望结果

PARENT_PART  GOOD_OR_FAULTY  BARCELONA  MADRID
0   KRC161262  GOOD            1.0        1.0
2   KRC161833  GOOD            1.0        NaN
3   KRC161834  GOOD            1.0        1.0

解决方案

不用循环,利用Pandas的unstack方法直接将分组后的CITY转为列,再合并GOOD_OR_FAULTY信息,高效解决重复行问题:

import pandas as pd

d = {'PARENT_PART': ['KRC161262', 'KRC161262', 'KRC161833', 'KRC161834', 'KRC161834'], 
     'CITY': ['BARCELONA', 'MADRID', 'BARCELONA', 'BARCELONA', 'MADRID'], 
     'GOOD_OR_FAULTY': ['GOOD', 'GOOD', 'GOOD','GOOD','FAULT']}
df = pd.DataFrame(data=d)

# 分组统计各PARENT_PART在对应城市的数量,将CITY转为列
city_count_df = df.groupby(['PARENT_PART', 'CITY']).size().unstack()

# 提取每个PARENT_PART的GOOD_OR_FAULTY(这里优先取非FAULT的值,可根据需求调整)
good_faulty_series = df.groupby('PARENT_PART')['GOOD_OR_FAULTY'].apply(
    lambda x: x[x != 'FAULT'].iloc[0] if any(x != 'FAULT') else x.iloc[0]
)

# 合并数据并调整列顺序
result = pd.concat([good_faulty_series, city_count_df], axis=1).reset_index()
result = result[['PARENT_PART', 'GOOD_OR_FAULTY', 'BARCELONA', 'MADRID']]

print(result)

输出结果

PARENT_PART GOOD_OR_FAULTY  BARCELONA  MADRID
0   KRC161262           GOOD        1.0     1.0
1   KRC161833           GOOD        1.0     NaN
2   KRC161834           GOOD        1.0     1.0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:50:38