Python中如何将聚合生成的分段列匹配合并至原DataFrame
问题描述
我有一张包含公司名称及各订单金额的表格:
| Order Id | Company Id | Company Name | Date | Order Value |
|---|---|---|---|---|
| 3455 | 80EYLOKP9E762WKG | Chimera-Chasing | 18-02-2017 | 2345 |
| 4875 | TLEXR1HZWTUTBHPB | Mellow Ezra | 30-07-2015 | 3245 |
| 8425 | 839FKFW2LLX4LMBB | Chimera-Chasing | 27-05-2016 | 4566 |
| 4837 | 97OX39BGVMHODLJM | Worst Mali | 27-09-2018 | 5674 |
| 3434 | 5T4LGH4XGBWOD49Z | Indonesian Grigory | 14-01-2016 | 7654 |
我需要添加一个新列,根据公司的订单总金额将其划分为Prime、Platinum、Gold、Silver四个分段,已完成以下步骤:
- 按公司名称聚合订单总金额:
seg = orders.loc[:,['Company Name', 'Order Value']].groupby('Company Name').sum()
聚合结果示例:
| Company Name | Order Value |
|---|---|
| '48 Wills | 65325 |
| 10-Day Causes | 85473 |
| 10-Hour Leak | 83021 |
| Youngish Mark'S | 120343 |
| 10-Year-Old Alba | 97968 |
| ... | ... |
- 通过条件判断添加分段列:
conditions = [ (seg['Order Value'] >= 124485), (seg['Order Value'] >= 105503) & (seg['Order Value'] < 124485), (seg['Order Value'] >= 88174) & (seg['Order Value'] < 105503), (seg['Order Value'] < 88174) ] values = ['Prime', 'Platinum', 'Gold', 'Silver'] seg['Segment'] = np.select(conditions, values)
现在需要将Segment列按公司名称匹配,添加到原DataFrame(orders)中,求实现方法。
解决方案
有两种简单高效的方法可以实现这个需求:
方法1:使用merge合并DataFrame
merge是Pandas中关联数据的常用方法,通过Company Name作为关联键,将seg中的Segment列合并到原orders表中:
# 重置seg的索引,将Company Name从索引转为普通列 seg_reset = seg.reset_index() # 合并到原orders表,仅保留需要的Segment列 orders_with_segment = orders.merge(seg_reset[['Company Name', 'Segment']], on='Company Name', how='left')
how='left'确保原orders的所有行都被保留,避免因数据缺失丢失订单记录。
方法2:使用map映射分段值
由于seg在聚合后Company Name是索引,可直接用map方法通过公司名称映射对应的Segment值:
# 直接用orders的Company Name列匹配seg的Segment值 orders['Segment'] = orders['Company Name'].map(seg['Segment'])
这种方法代码更简洁,适合一对一的映射场景;如果需要合并多列数据,merge方法会更灵活。
内容的提问来源于stack exchange,提问作者mostafa ibrahim
相关产品推荐
相关产品推荐

