Pandas中对应R dplyr::first/last分组后子数据集首尾值的实现
Pandas中实现dplyr::first/last的等价功能
当然有,Pandas里可以通过分组后结合transform方法实现和R语言dplyr包中dplyr::first/dplyr::last完全一致的效果——也就是分组后将每组的首/尾元素广播填充到该组的所有行,这和单纯用head(1)只取每组第一行的行为完全不同。
对应R示例的实现代码
首先构造和R示例一致的DataFrame:
import pandas as pd df = pd.DataFrame({ 'value': range(2, 11, 2), 'id': ['R', 'R', 'C', 'R', 'C'] })
实现dplyr::first的效果
# 给每个分组添加首元素列 df['first_of_subdf'] = df.groupby('id')['value'].transform('first')
执行后得到的结果和R示例完全一致:
| value | id | first_of_subdf |
|---|---|---|
| 2 | R | 2 |
| 4 | R | 2 |
| 6 | C | 6 |
| 8 | R | 2 |
| 10 | C | 6 |
实现dplyr::last的效果
同理,要添加每组的尾元素列,只需把'first'换成'last':
# 给每个分组添加尾元素列 df['last_of_subdf'] = df.groupby('id')['value'].transform('last')
执行后结果:
| value | id | first_of_subdf | last_of_subdf |
|---|---|---|---|
| 2 | R | 2 | 8 |
| 4 | R | 2 | 8 |
| 6 | C | 6 | 10 |
| 8 | R | 2 | 8 |
| 10 | C | 6 | 10 |
补充说明
transform('first')本质是对每个分组执行取首元素的操作,然后将结果广播到该组的所有行,这和R中group_by + mutate + first的逻辑完全匹配。- 也可以用lambda表达式实现等价效果:
transform(lambda x: x.iloc[0]),但直接使用字符串'first'/'last'的写法更简洁且性能更优。
内容的提问来源于stack exchange,提问作者Fernando Rocha Urbano
相关产品推荐
相关产品推荐

