为DataFrame添加列并按父级分组为每行分配子级序号
解决方案
你可以通过Pandas的分组(groupby)和累计计数(cumcount)方法实现这个需求,步骤如下:
1. 构造原始DataFrame
先还原你提供的原始数据:
import pandas as pd data = { 'Father': ['James', 'James', 'Corey'], 'Son': ['Harry', 'Alfi', 'Kyle'], 'Year': [1999, 2001, 2003] } df = pd.DataFrame(data)
2. 添加Child列
核心逻辑是按Father分组,组内按Year升序排序后,为每行分配从1开始的连续序号。可以用以下代码实现:
# 先按Father和Year排序,确保组内顺序符合要求 df_sorted = df.sort_values(by=['Father', 'Year']) # 按Father分组生成从1开始的序号 df_sorted['Child'] = df_sorted.groupby('Father').cumcount() + 1 # 如果需要保留原始DataFrame的行顺序,可通过合并还原 df = df.merge(df_sorted[['Father', 'Son', 'Child']], on=['Father', 'Son'])
也可以用更简洁的链式写法:
df['Child'] = df.sort_values(['Father', 'Year']).groupby('Father').cumcount() + 1
执行后得到的结果如下:
| Father | Son | Year | Child |
|---|---|---|---|
| James | Harry | 1999 | 1 |
| James | Alfi | 2001 | 2 |
| Corey | Kyle | 2003 | 1 |
关键说明
sort_values(['Father', 'Year']):保证每个父亲对应的子级按出生年份从小到大排列groupby('Father').cumcount():对每个分组内的行从0开始计数,加1后得到从1起始的序号
内容的提问来源于stack exchange,提问作者lasnik11
相关产品推荐
相关产品推荐

