如何在for循环中向pandas.DataFrame追加行?循环后仅存最后一行问题求助
解决pandas循环追加行后仅保留最后一条记录的问题
我一眼就看出问题出在哪了,咱们一步步拆解:
你的代码里的两个核心问题
- 每次循环都覆盖了
dd变量:你在循环内部每次都用pd.DataFrame(...)重新创建了dd,这就导致之前循环生成的内容全被覆盖了,最后自然只剩最后一次循环的结果。 append操作没有生效:pandas的append()方法(现在已经被标记为弃用了)是返回一个新的DataFrame对象,不会修改原有的dd。而且你写的dd.append(dd)其实是把当前的dd追加给自己,完全不是你想要的“添加新行”的效果。
两种正确的实现方式
方式一:提前初始化空DataFrame,用concat追加(推荐用于小数据量)
如果你的active_brain_regions元素不多,可以先建一个空的DataFrame,然后循环里把每一行的小DataFrame合并进去:
# 先初始化带列名的空DataFrame dd = pd.DataFrame(columns=['region', 'mean expr', 'gene_id']) for i in active_brain_regions: indices = np.where(LM == i) expr = gene[indices] mean = np.mean(expr) # 生成当前行的DataFrame new_row = pd.DataFrame([[i, mean, "nifti"]], columns=['region', 'mean expr', 'gene_id']) # 用concat合并并重新赋值给dd,ignore_index=True重置索引 dd = pd.concat([dd, new_row], ignore_index=True)
方式二:先收集数据到列表,最后一次性生成DataFrame(更高效)
当数据量比较大的时候,循环里反复修改DataFrame会有性能损耗,最好先把所有行的数据存在列表里,最后再一次性创建DataFrame:
# 初始化空列表存每一行的数据 data_rows = [] for i in active_brain_regions: indices = np.where(LM == i) expr = gene[indices] mean = np.mean(expr) # 把当前行的三个值加入列表 data_rows.append([i, mean, "nifti"]) # 最后用列表直接生成DataFrame dd = pd.DataFrame(data_rows, columns=['region', 'mean expr', 'gene_id'])
这样运行后,你就能得到包含所有region行的DataFrame了,和你期望的格式一致。
内容的提问来源于stack exchange,提问作者Anja
相关产品推荐
相关产品推荐

