Pandas为现有DataFrame分组添加新行报错,求替代append的方法
问题:为分组后的Pandas DataFrame添加指定新行
需求:对已有的Pandas DataFrame按group字段分组后,为每组末尾添加一行新行——新行的group为当前组名称、year为该组对应的年份、value为空值。
初始数据代码
import pandas as pd import random random.seed(42) data = {'group':['a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c' ], 'value' : [1, 2, 5, 3, 4, 5, 7, 4, 7, 9], 'year': ['2010', '2010', '2010', '2011', '2011', '2011', '2011', '2012', '2012','2012', ]} df = pd.DataFrame(data)
期望输出格式
group value year 0 a 1 2010 1 a 2 2010 2 a 5 2010 3 a 2010 0 b 3 2011 1 b 4 2011 2 b 5 2011 3 b 7 2011 4 b 2011 0 c 4 2012 1 c 7 2012 2 c 9 2012 3 c 2012
尝试的代码及报错
最初尝试用append方法实现,但收到Pandas的弃用警告:
new_row={'value':''} df2 = df.groupby(df['group']) df = pd.concat([i.append(new_row, ignore_index=True) for _, i in df2]) df
报错提示:
FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead. df = pd.concat([i.append(new_row, ignore_index=True) for _, i in df2])
解决方案
方法一:分组后用pd.concat替换append
在分组处理逻辑中,用pd.concat替代DataFrame.append,直接拼接每组数据和新行,彻底规避弃用警告:
def add_empty_row(group_df): # 获取当前组的group和year值 current_group = group_df['group'].iloc[0] current_year = group_df['year'].iloc[0] # 构建新行的DataFrame empty_row = pd.DataFrame({'group': [current_group], 'year': [current_year], 'value': ['']}) # 拼接原组数据与新行 return pd.concat([group_df, empty_row], ignore_index=True) # 分组应用函数并合并结果 result_df = df.groupby('group', group_keys=False).apply(add_empty_row) print(result_df)
方法二:批量构建空行后整体合并
先提取每个分组的group和year信息,批量生成所有需要添加的空行,再和原数据合并后排序,适合数据量较大的场景:
# 提取每个分组的唯一group和year group_year = df.groupby('group')[['group', 'year']].first().reset_index(drop=True) # 设置空行的value为空 group_year['value'] = '' # 合并原数据与空行数据 combined_df = pd.concat([df, group_year], ignore_index=True) # 按group排序,确保空行在每组末尾 result_df = combined_df.sort_values(by=['group', 'value'], na_position='last', ignore_index=True) print(result_df)
两种方法均能满足需求,且不会触发append的弃用警告。方法一逻辑直观,适合小数据集;方法二效率更高,适合大规模数据处理。
内容的提问来源于stack exchange,提问作者ruthpozuelo
相关产品推荐
相关产品推荐

