使用Pandas基于列特定值生成新列的分组匹配需求
Pandas DataFrame 分组转换处理方案
原始数据结构
| A | B | C | Category | Value |
|---|---|---|---|---|
| 1 | A | Prime | Unique | 0 |
| 2 | A | Prime | One | Initials |
| 1 | A | Prime | Two | Seconds |
| 2 | B | Prime | Unique | 1 |
| 2 | B | Prime | One | Firsts |
需求说明
按A、B、C三列分组,将每组内Category为Unique的记录转为新列Unique,把对应的Value值匹配到同组其他记录中,同时剔除Category为Unique的原始行,最终得到如下目标结构:
| A | B | C | Category | Value | Unique |
|---|---|---|---|---|---|
| 2 | A | Prime | One | Initials | |
| 1 | A | Prime | Two | Seconds | 0 |
| 2 | B | Prime | One | Firsts | 1 |
实现代码
import pandas as pd # 构造原始DataFrame df = pd.DataFrame({ 'A': [1, 2, 1, 2, 2], 'B': ['A', 'A', 'A', 'B', 'B'], 'C': ['Prime']*5, 'Category': ['Unique', 'One', 'Two', 'Unique', 'One'], 'Value': ['0', 'Initials', 'Seconds', '1', 'Firsts'] }) # 提取每组的Unique值映射表 unique_map = df[df['Category'] == 'Unique'].set_index(['A', 'B', 'C'])['Value'].rename('Unique') # 过滤掉Category为Unique的行 filtered_df = df[df['Category'] != 'Unique'] # 左连接匹配同组的Unique值 result_df = filtered_df.merge(unique_map, how='left', on=['A', 'B', 'C']) # 对齐目标列顺序 result_df = result_df[['A', 'B', 'C', 'Category', 'Value', 'Unique']] print(result_df)
代码说明
- 构建映射表:筛选出
Category为Unique的记录,以A、B、C为索引,提取对应的Value并命名为Unique,得到每组的Unique值对应关系。 - 过滤原始行:移除原始数据中
Category为Unique的记录,只保留需要匹配的目标行。 - 匹配合并:通过左连接将映射表与过滤后的DataFrame合并,自动按分组匹配Unique值,组内无对应Unique记录时,该列自动填充为空。
内容的提问来源于stack exchange,提问作者user12637176
相关产品推荐
相关产品推荐

