Pandas GroupBy自定义Lambda函数报错:计算PROP_ID分组的CATEGORY_DIFF首尾差值
问题解决:按PROP_ID分组计算CATEGORY_DIFF首尾差值
原始DataFrame结构
| 序号(IDX) | 物业ID(PROP_ID) | 年份(YEAR) | 类别(CATEGORY) | 类别差值(CATEGORY_DIFF) |
|---|---|---|---|---|
| 1 | 1001 | 1987 | 1 | 0 |
| 2 | 1001 | 1987 | 2 | 1 |
| 3 | 1002 | 1990 | 1 | 0 |
| 5 | 1002 | 1990 | 1 | 0 |
| 6 | 1002 | 1990 | 2 | 1 |
| 7 | 1002 | 1990 | 3 | 2 |
| ... | ... | ... | ... | ... |
需求与报错代码
需要按PROP_ID分组,计算每个分组内CATEGORY_DIFF的第二个值与第一个值的差值。使用以下代码时持续报错:
df_prop_id = df.groupby('PROP_ID')['CATEGORY_DIFF'].apply(lambda x: x[1] - x[0])
期望结果
| PROP_ID | x[1]-x[0] |
|---|---|
| 1001 | 1 |
| 1002 | 0 |
解决方案
报错核心原因是分组后的子Series保留了原始DataFrame的非连续索引,直接用x[1]会找不到对应索引的元素。可以用以下两种方法解决:
方法1:使用iloc按位置取值
iloc是基于位置的索引,不受原索引影响,直接取分组内第1位和第0位元素计算差值(Python索引从0开始,对应你要的第二个和第一个值):
df_prop_id = df.groupby('PROP_ID')['CATEGORY_DIFF'].apply(lambda x: x.iloc[1] - x.iloc[0])
方法2:重置分组内索引后取值
先重置每个分组的索引为连续整数,再按索引取值:
df_prop_id = df.groupby('PROP_ID')['CATEGORY_DIFF'].apply(lambda x: x.reset_index(drop=True)[1] - x.reset_index(drop=True)[0])
结果格式化(可选)
如果需要将结果转为和期望一致的DataFrame格式,可执行重命名和重置索引操作:
df_prop_id = df_prop_id.rename('x[1]-x[0]').reset_index()
内容的提问来源于stack exchange,提问作者HuckleberryFinn
相关产品推荐
相关产品推荐

