我有一个数据框架:

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()函数,但找不到正确的方法。

如何添加/插入系列数据帧?


当前回答

按照下面的例子做:

A_row = pd。系列([1,2])

Df = pd。DataFrame([[3,4], [5,6]])

row_df = pd.DataFrame([a_row])

Df = pd。concat([row_df, df], ignore_index=True)

结果是:

   0  1
0  1  2
1  3  4
2  5  6

其他回答

实现这一点的一种方法是

>>> pd.DataFrame(np.array([[2, 3, 4]]), columns=['A', 'B', 'C']).append(df, ignore_index=True)
Out[330]: 
   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9

通常,添加数据框架是最简单的,而不是序列。在您的例子中,由于您希望新行位于“顶部”(带有起始id),并且没有pd.prepend()函数,因此我首先创建新的数据框架,然后添加旧的数据框架。

Ignore_index将忽略数据帧中旧的正在进行的索引,并确保第一行实际上从索引1开始,而不是从索引0重新开始。

典型免责声明:Cetero censeo…追加行是一种非常低效的操作。如果你关心性能,并且能够以某种方式确保首先创建一个具有正确(更长)索引的数据帧,然后将额外的行插入到数据帧中,那么你一定要这样做。看到的:

>>> index = np.array([0, 1, 2])
>>> df2 = pd.DataFrame(columns=['A', 'B', 'C'], index=index)
>>> df2.loc[0:1] = [list(s1), list(s2)]
>>> df2
Out[336]: 
     A    B    C
0    5    6    7
1    7    8    9
2  NaN  NaN  NaN
>>> df2 = pd.DataFrame(columns=['A', 'B', 'C'], index=index)
>>> df2.loc[1:] = [list(s1), list(s2)]

到目前为止,我们有你的df:

>>> df2
Out[339]: 
     A    B    C
0  NaN  NaN  NaN
1    5    6    7
2    7    8    9

但是现在您可以像下面那样轻松地插入行。由于空间是预先分配的,因此效率更高。

>>> df2.loc[0] = np.array([2, 3, 4])
>>> df2
Out[341]: 
   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9

给出熊猫数据框架的数据结构是一个序列列表(每个序列为一列),方便在任意位置插入一列。 我想到的一个办法是先转置数据帧,插入一列,再转置回来。你可能还需要重命名索引(行名),就像这样:

s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])

df = pd.DataFrame([list(s1), list(s2)],  columns =  ["A", "B", "C"])
df = df.transpose()
df.insert(0, 2, [2,3,4])
df = df.transpose()
df.index = [i for i in range(3)]
df

    A   B   C
0   2   3   4
1   5   6   7
2   7   8   9

在pandas数据帧中添加一行的最简单方法是:

DataFrame.loc[ location of insertion ]= list( )

例子:

DF.loc[ 9 ] = [ ´Pepe’ , 33, ´Japan’ ]

注意:列表的长度应该与数据帧的长度相匹配。

Concat()似乎比上一行插入和重新索引快一些。 如果有人想知道两种顶级方法的速度:

In [x]: %%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.1 s±705 ms(平均±标准值7次运行,每循环1次)

In [y]: %%timeit
     ...: df = pd.DataFrame(columns=['a', 'b'])
     ...: for i in range(10000):
     ...:     df = pd.concat([pd.DataFrame([[1,2]], columns=df.columns), df])

每循环6.53 s±127 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)