我有一个数据框架:
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()函数,但找不到正确的方法。
如何添加/插入系列数据帧?
我突然想到,也许T属性是一个有效的选择。转置,可以避开误导人的df。Loc[-1] =[2,3,4],就像@flow2k提到的那样,它适用于更通用的情况,比如你想在任意行之前插入[2,3,4],这是concat(),append()难以实现的。没有必要为定义和调试函数而费心。
a = df.T
a.insert(0,'anyName',value=[2,3,4])
# just give insert() any column name you want, we'll rename it.
a.rename(columns=dict(zip(a.columns,[i for i in range(a.shape[1])])),inplace=True)
# set inplace to a Boolean as you need.
df=a.T
df
A B C
0 2 3 4
1 5 6 7
2 7 8 9
我想这可以部分解释@MattCochrane抱怨为什么pandas没有像insert()那样插入一行的方法。
测试了几个答案,很明显使用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次)
下面是在不排序和重置索引的情况下将一行插入pandas数据框架的最佳方法:
import pandas as pd
df = pd.DataFrame(columns=['a','b','c'])
def insert(df, row):
insert_loc = df.index.max()
if pd.isna(insert_loc):
df.loc[0] = row
else:
df.loc[insert_loc + 1] = row
insert(df,[2,3,4])
insert(df,[8,9,0])
print(df)
对于那些想要连接前一个数据帧的行,使用双括号([[…]])作为iloc。
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
pd.concat((df.iloc[[0]], # [[...]] used to slice DataFrame as DataFrame
df), ignore_index=True)
# A B C
# 0 5 6 7
# 1 5 6 7
# 2 7 8 9
若要复制或复制任意时间,请与星号组合。
pd.concat((df.iloc[[0]],
df,
*[df.iloc[[1]]] * 4), ignore_index=True)
# A B C
# 0 5 6 7
# 1 7 8 9
# 2 7 8 9
# 3 7 8 9
# 4 7 8 9