You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Python循环中从已有Pandas DataFrame添加指定行到新表的问题

问题解决:Pandas按条件筛选行并构建新DataFrame

你的三种写法问题分析

  1. 第一种写法错误原因:
    循环里每次都用second_df = existing_df.iloc[specific_idx]直接覆盖变量,最后只会保留最后一次循环的单行(返回的是Series而非DataFrame),所以最终shape是(15,)。

  2. 第二种写法错误原因:
    existing_df[existing_df[col] == specific_val]返回的是单个行的小DataFrame(shape(1,15)),把1000个这种小DataFrame放进列表后,用pd.DataFrame()转换时会把每个小DataFrame当作一个元素,生成三维结构,触发"必须传入二维输入"的报错。

  3. 第三种写法错误原因:
    pd.concat()要求传入Series或DataFrame的序列,你传的[new_df, specific_rows]里specific_rows是列表,不是可直接拼接的对象,所以报错。


正确解决方案

方案1:直接用iloc传索引列表(最快最简洁)

如果specific_idx_set是整数索引的集合,直接转成列表传给iloc,一步生成目标DataFrame:

second_df = existing_df.iloc[list(specific_idx_set)]

直接得到1000行15列的结果,无需循环。

方案2:用isin批量筛选(适合按列值匹配场景)

如果你的逻辑是按col列的特定值筛选,不用循环,直接用isin批量匹配:

new_df = existing_df[existing_df[col].isin(specific_idx_set)]

这会直接返回所有col值在specific_idx_set范围内的行。

方案3:修正循环+concat的写法

如果一定要用循环(不推荐,效率较低),需把列表里的DataFrame直接传给concat:

specific_rows = []
for specific_val in specific_idx_set:
    specific_rows.append(existing_df[existing_df[col] == specific_val])
# 拼接列表内所有小DataFrame,ignore_index重置索引避免重复
new_df = pd.concat(specific_rows, ignore_index=True)

内容的提问来源于stack exchange,提问作者Sara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:40:19