在熊猫数据框中插入一行


111

我有一个数据框:

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()起作用,但是找不到正确的方法。

如何在数据框中添加/插入序列?


6
请注意,最好使用s1.values而不是,list(s1)因为您将使用创建一个全新的列表list(s1)
acushner 2014年

7
我不明白为什么每个人都这么爱大熊猫,而那些本来应该如此简单的事情却是如此的痛苦而缓慢。
MattCochrane

Answers:


144

只需使用以下命令将行分配给特定索引loc

 df.loc[-1] = [2, 3, 4]  # adding a row
 df.index = df.index + 1  # shifting index
 df = df.sort_index()  # sorting by index

然后,您可以根据需要获得:

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

请参阅Pandas文档中的“ 索引:放大设置”


2
如果你不想用集扩大,但插入数据帧里面,看看stackoverflow.com/questions/15888648/...
FooBar的

6
移位索引替代:df.sort()。reset_index(drop = True)
Meloun 2014年

2
df.sort已弃用,请使用df.sort_index()
GBGOLC

1
@Piotr-这很好用,但是当您要从数据框中复制一行(例如df.loc[-1] = df.iloc[[0]])并将其插入时,会发生什么呢?该框架带有一个附加的索引列给错误ValueError: cannot set a row with mismatched columns (见stackoverflow.com/questions/47340571/...
咆哮

5
我认为df.loc[-1] = [2, 3, 4] # adding a row这有点误导,-1不是最后一行/元素,就像Python数组一样。
flow2k

26

不确定您的调用方式,concat()但是只要两个对象的类型相同,它就可以正常工作。也许问题是您需要将第二个向量转换为数据框?使用您定义的df,以下对我有用:

df2 = pd.DataFrame([[2,3,4]], columns=['A','B','C'])
pd.concat([df2, df])

最佳答案^ :)
Cam.Davidson.Pilon,

23

实现此目的的一种方法是

>>> 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会忽略数据框中旧的正在进行的索引,并确保第一行实际上以index开头,1而不是以index重启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

那是一个不错的workarround解决方案,我试图将系列插入数据框。目前对我来说已经足够了。
Meloun 2014年

我最喜欢最后一个选择。这确实符合我的真正意愿。谢谢@FooBar!
Jade Cacho

13

我整理了一个简短的函数,该函数在插入行时具有更大的灵活性:

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


7

我们可以使用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告诉函数要放置新值的位置/索引。


6

这看似过于简单,但令人难以置信的是,没有内置简单的插入新行功能。我已经读了很多关于将新df附加到原始df的信息,但是我想知道这样做是否会更快。

df.loc[0] = [row1data, blah...]
i = len(df) + 1
df.loc[i] = [row2data, blah...]

如代码所示,您的意思是“添加新的df”还是“添加新的行”?
smci

对不起,我的句子不清楚。我读过其他人的解决方案,它们仅用一行就可以连接/附加一个全新的数据框。但是在我的解决方案中,它仅是现有数据框中的一行,而无需创建其他数据框
Aaron Melgar

6

以下是在不排序和重置索引的情况下将行插入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)

你为什么说这是最好的方法?
尤卡

那么提供证据支持该主张就很好了,您计时了吗?
尤卡

1
您可以使用pd.isna避免导入numpy
kato2

1

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毫秒(平均±标准偏差,共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毫秒(平均±标准偏差,共7次运行,每个循环1次)


1

在pandas中添加一行很简单DataFrame

  1. 创建一个与您的列名称相同的常规Python字典Dataframe

  2. 使用pandas.append()method并传入您的字典名称,其中.append()DataFrame实例上的方法是;

  3. ignore_index=True在您的词典名称之后添加。


这可能是最可取的选择(大约2020年)。
David Golembiowski

0

您可以简单地将行追加到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用作:

df = pd.concat([pd.DataFrame([[1,2,3,4,5,6]],columns=df.columns),df],ignore_index=True)

-1

在熊猫数据框中添加一行的最简单方法是:

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

范例:

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

注意:列表的长度应与数据框的长度匹配。


为我做了把戏!
山姆·肖
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.