Pandas:在不保留索引的情况下将DataFrame插入另一个DataFrame
在指定位置插入Pandas DataFrame的正确方法
我完全懂你遇到的困扰:想在某个指定索引位置把一个DataFrame插入另一个,结果用修改单值的方法(比如df.loc[index] = ...)根本不管用,反而Pandas会按照索引标签去匹配待插入DataFrame的值,完全不是插入行的效果。这是因为loc是基于索引标签进行操作的,而不是按位置插入,咱们换个思路就能解决。
核心解决方案:拆分原DataFrame再拼接
最稳妥的方式是把原DataFrame拆成插入位置前后两部分,然后用pd.concat()把「前半部分 + 待插入DataFrame + 后半部分」拼起来。这样就不会出现索引匹配的问题,完全按位置插入。
举个实际例子:
import pandas as pd # 原DataFrame df_main = pd.DataFrame({'Col1': [10, 20, 30], 'Col2': [100, 200, 300]}) # 要插入的小DataFrame df_insert = pd.DataFrame({'Col1': [15], 'Col2': [150]}) # 指定插入位置:比如在原DataFrame的第2行(索引为1的位置之后,插入后成为第2行) insert_position = 1 # 拆分+拼接 result_df = pd.concat([ df_main.iloc[:insert_position], # 取插入位置之前的所有行 df_insert, # 插入的DataFrame df_main.iloc[insert_position:] # 取插入位置之后的所有行 ], ignore_index=True) # ignore_index=True会重置索引,避免重复或混乱
运行后result_df的结果就是你想要的:
Col1 Col2 0 10 100 1 15 150 2 20 200 3 30 300
为什么你原来的方法不行?
当你尝试用df_main.loc[insert_position] = df_insert时,Pandas会把df_insert的索引标签和df_main的索引标签做匹配。比如如果df_insert的索引是0,而你要赋值的位置索引是1,Pandas找不到对应标签,就会把该行设为NaN;如果两者索引标签相同,那就是替换该行的值,而不是插入。这和你想要的「插入行」完全不是一个逻辑。
额外注意事项
- 确保待插入的DataFrame和原DataFrame的列名完全一致,否则拼接后会出现缺失值列。
- 如果不需要重置索引,可以去掉
ignore_index=True,但可能会出现重复索引,后续操作要注意。 - 如果插入的是多行DataFrame,这个方法同样适用,不需要修改代码逻辑。
内容的提问来源于stack exchange,提问作者user3053216
相关产品推荐
相关产品推荐

