我有一个数据框架:
s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])
df = pd.DataFrame([list(s1), list(s2)], columns = ["A", "B", "C"])
A B C
0 5 6 7
1 7 8 9
[2 rows x 3 columns]
并且我需要添加第一行[2,3,4],得到:
A B C
0 2 3 4
1 5 6 7
2 7 8 9
我尝试过append()和concat()函数,但找不到正确的方法。
如何添加/插入系列数据帧?
测试了几个答案,很明显使用pd.concat()对于大数据帧更有效。
比较使用dict和list的性能,list的效率更高,但对于小数据帧,使用dict应该没有问题,而且可读性更好。
1st - pd.concat() +列表
%%timeit
df = pd.DataFrame(columns=['a', 'b'])
for i in range(10000):
df = pd.concat([pd.DataFrame([[1,2]], columns=df.columns), df], ignore_index=True)
每循环4.88 s±47.1 ms(平均±标准值7次运行,每循环1次)
2nd - pd.append() + dict
%%timeit
df = pd.DataFrame(columns=['a', 'b'])
for i in range(10000):
df = df.append({'a': 1, 'b': 2}, ignore_index=True)
每循环10.2 s±41.4 ms(平均±标准值7次运行,每循环1次)
第三- pd.DataFrame()。Loc +索引操作
%%timeit
df = pd.DataFrame(columns=['a','b'])
for i in range(10000):
df.loc[-1] = [1,2]
df.index = df.index + 1
df = df.sort_index()
每循环17.5 s±37.3 ms(平均±标准值7次运行,每循环1次)
我们可以使用numpy.insert。这具有灵活性的优点。您只需要指定要插入的索引。
s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])
df = pd.DataFrame([list(s1), list(s2)], columns = ["A", "B", "C"])
pd.DataFrame(np.insert(df.values, 0, values=[2, 3, 4], axis=0))
0 1 2
0 2 3 4
1 5 6 7
2 7 8 9
np.insert (df。Values, 0, Values =[2,3,4], axis=0), 0告诉函数要放置新值的位置/索引。
我把一个简短的函数放在一起,在插入一行时允许更多的灵活性:
def insert_row(idx, df, df_insert):
dfA = df.iloc[:idx, ]
dfB = df.iloc[idx:, ]
df = dfA.append(df_insert).append(dfB).reset_index(drop = True)
return df
可以进一步缩写为:
def insert_row(idx, df, df_insert):
return df.iloc[:idx, ].append(df_insert).append(df.iloc[idx:, ]).reset_index(drop = True)
然后你可以使用如下语句:
df = insert_row(2, df, df_new)
其中2是df中要插入df_new的索引位置。
您可以简单地将行追加到DataFrame的末尾,然后调整索引。
例如:
df = df.append(pd.DataFrame([[2,3,4]],columns=df.columns),ignore_index=True)
df.index = (df.index + 1) % len(df)
df = df.sort_index()
或者使用concat as:
df = pd.concat([pd.DataFrame([[1,2,3,4,5,6]],columns=df.columns),df],ignore_index=True)