在Python循环中从已有Pandas DataFrame添加指定行到新表的问题
问题解决:Pandas按条件筛选行并构建新DataFrame
你的三种写法问题分析
第一种写法错误原因:
循环里每次都用second_df = existing_df.iloc[specific_idx]直接覆盖变量,最后只会保留最后一次循环的单行(返回的是Series而非DataFrame),所以最终shape是(15,)。第二种写法错误原因:
existing_df[existing_df[col] == specific_val]返回的是单个行的小DataFrame(shape(1,15)),把1000个这种小DataFrame放进列表后,用pd.DataFrame()转换时会把每个小DataFrame当作一个元素,生成三维结构,触发"必须传入二维输入"的报错。第三种写法错误原因:
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
相关产品推荐
相关产品推荐

