如何在循环中将每次迭代的Series追加为Pandas DataFrame新列?
解决方案:循环生成Series并添加为DataFrame新列
首先我得说,在pandas里处理这类需求,先收集所有要添加的Series再一次性合并是最高效的方式(尤其是数据量大的时候),毕竟pandas每次追加列都会复制数据,循环里反复操作会拖慢速度。当然如果你的数据量很小,直接在循环里加列也完全没问题,两种方法我都给你列出来。
方法1:先收集Series,再一次性合并(推荐)
假设你的循环是基于某个迭代对象(比如不同年份、类别),每次生成一个GC_tX格式的Series,步骤如下:
import pandas as pd # 模拟你的原DataFrame ar(已存在且包含'year of application'列) ar = pd.DataFrame({'year of application': [2020, 2021, 2022, 2023], 'existing_col': [10, 20, 30, 40]}) # 初始化空字典,用来暂存所有要添加的Series new_cols_dict = {} # 模拟你的循环:这里以生成GC_t1、GC_t2为例 for i in range(1, 3): # 替换成你从透视表选择列生成Series的代码 # 核心要求:生成的Series索引必须和ar的索引完全匹配!否则会出现数据错位 gc_series = pd.Series([i*100, i*200, i*300, i*400], index=ar.index) # 给列起名字,比如GC_t1、GC_t2 col_name = f'GC_t{i}' # 将Series存入字典 new_cols_dict[col_name] = gc_series # 把字典转成DataFrame,和原ar按列合并 ar = pd.concat([ar, pd.DataFrame(new_cols_dict)], axis=1) # 查看最终结果 print(ar)
运行后你会看到ar成功新增了GC_t1和GC_t2两列,完全符合你的需求。
方法2:循环中直接追加列(适合小数据量)
如果数据量不大,不想折腾字典收集,也可以直接在循环里给ar新增列:
import pandas as pd ar = pd.DataFrame({'year of application': [2020, 2021, 2022, 2023], 'existing_col': [10, 20, 30, 40]}) for i in range(1, 3): # 生成目标Series,注意索引匹配 gc_series = pd.Series([i*100, i*200, i*300, i*400], index=ar.index) col_name = f'GC_t{i}' # 直接赋值给ar的新列 ar[col_name] = gc_series print(ar)
关键注意事项!
- 必须保证生成的Series索引和原DataFrame
ar的索引完全一致,否则pandas会自动对齐索引,导致数据错位或出现NaN值。 - 如果你的透视表生成的Series索引和ar不匹配(比如透视表索引是年份值,而ar用的是默认数字索引),可以用
reindex对齐:# 假设gc_series的索引是年份(如2020、2021),ar的'year of application'是对应列 gc_series = gc_series.reindex(ar['year of application']) # 对齐后再赋值给ar的新列 ar[col_name] = gc_series
内容的提问来源于stack exchange,提问作者himi64
相关产品推荐
相关产品推荐

