为Pandas DataFrame各ID添加增量行的实现问题及报错解决
解决Pandas为每个ID追加指定行的KeyError问题
错误原因
你遇到的KeyError: 'id',大概率是因为使用groupby('id')时默认将id设为分组索引,而非保留为普通列。此时在自定义函数中尝试通过group['id']访问列时,自然找不到对应的键。
解决方案
下面提供两种高效实现需求的方式:
方法1:利用groupby的组名构造新行
这种方式无需修改分组参数,直接通过group.name获取当前组的ID值:
import pandas as pd # 初始数据示例 df = pd.DataFrame({ 'id': [1, 1, 2, 2], 'col1': [10, 20, 30, 40], 'col2': [100, 200, 300, 400] }) def append_rows(group): # 构造要追加的两行数据,用group.name获取当前组的ID new_rows = pd.DataFrame({ 'id': [group.name, group.name], 'col1': [0, 0], 'col2': [40, 50] }) # 合并原组数据与新行 return pd.concat([group, new_rows], ignore_index=True) # 分组处理后重置索引 result = df.groupby('id').apply(append_rows).reset_index(drop=True)
方法2:先构造所有追加行再合并(更高效)
如果数据量较大,这种方式性能更优,避免逐组处理的开销:
import pandas as pd import numpy as np # 初始数据示例 df = pd.DataFrame({ 'id': [1, 1, 2, 2], 'col1': [10, 20, 30, 40], 'col2': [100, 200, 300, 400] }) # 获取所有唯一ID unique_ids = df['id'].unique() # 构造需要追加的所有行:每个ID对应两行col1=0,col2=40/50 append_df = pd.DataFrame({ 'id': np.repeat(unique_ids, 2), 'col1': 0, 'col2': np.tile([40, 50], len(unique_ids)) }) # 合并原数据与追加行,按ID排序(可选,保持原数据在前) result = pd.concat([df, append_df], ignore_index=True).sort_values('id').reset_index(drop=True)
验证结果
两种方法最终得到的result都会是:
| id | col1 | col2 |
|---|---|---|
| 1 | 10 | 100 |
| 1 | 20 | 200 |
| 1 | 0 | 40 |
| 1 | 0 | 50 |
| 2 | 30 | 300 |
| 2 | 40 | 400 |
| 2 | 0 | 40 |
| 2 | 0 | 50 |
内容的提问来源于stack exchange,提问作者mehdi selbi
相关产品推荐
相关产品推荐

