如何用Pandas基于两列创建新列并实现聚合结果
Pandas原生实现行列转换方案
核心方法:使用pivot进行数据重塑
你的需求本质是将行级的厂商数据转换为列级,Pandas的pivot方法是原生且高效的解决方案,完全不需要转字典处理。
步骤1:执行pivot转换
首先通过pivot将Car Maker的不同取值转为列,City作为分组依据,Qty作为对应值:
import pandas as pd df = pd.DataFrame({'City':['Los Angeles', 'Denver','Denver','Los Angeles'], 'Car Maker': ['Ford','Toyota','Ford','Toyota'], 'Qty': [50000,100000,80000,70000]}) # 执行pivot,将厂商转为列 pivoted = df.pivot(index='City', columns='Car Maker', values='Qty').reset_index()
此时得到的结果已经实现了核心需求:每个城市一行,Ford和Toyota列对应各自的Qty:
| City | Ford | Toyota | |
|---|---|---|---|
| 0 | Denver | 80000 | 100000 |
| 1 | Los Angeles | 50000 | 70000 |
步骤2:添加Car Maker列(按需)
你的目标表格中保留了Car Maker列,但每个城市对应两个厂商,这里我们取每个城市首次出现的厂商值(和你给出的目标一致):
# 提取每个城市的首个厂商 car_maker_series = df.groupby('City')['Car Maker'].first().reset_index(name='Car Maker') # 合并到pivot结果中 result = pd.merge(pivoted, car_maker_series, on='City') # 调整列顺序匹配目标表格 result = result[['City', 'Car Maker', 'Ford', 'Toyota']]
最终得到的result就是你想要的目标表格:
| City | Car Maker | Ford | Toyota | |
|---|---|---|---|---|
| 0 | Denver | Toyota | 80000 | 100000 |
| 1 | Los Angeles | Ford | 50000 | 70000 |
补充说明
- 如果你的数据中存在同一城市+同一厂商的多条记录,可以改用
pivot_table并指定聚合函数(比如sum):pd.pivot_table(df, index='City', columns='Car Maker', values='Qty', aggfunc='sum').reset_index() - 目标中的
Car Maker列实际意义有限(每个城市对应多个厂商),如果不需要可以直接省略步骤2。
内容的提问来源于stack exchange,提问作者Andre
相关产品推荐
相关产品推荐

