如何删除熊猫数据框的最后一行数据


104

我认为这应该很简单,但是我尝试了一些想法,但都没有成功:

last_row = len(DF)
DF = DF.drop(DF.index[last_row])  #<-- fail!

我尝试使用负索引,但这也会导致错误。我仍然会误解一些基本知识。


27
DF = DF[:-1]
U2EF1 2014年

@ U2EF1这会复制整个数据集,不是吗?当处理海量数据时,这可能是一个问题。
ManuelSchneid3r

Answers:


163

要删除最后n行:

df.drop(df.tail(n).index,inplace=True) # drop last n rows

同样,您可以删除前n行:

df.drop(df.head(n).index,inplace=True) # drop first n rows

要删除最后一列,可以使用df.drop(df.columns [-1],axis = 1,inplace = True),或者,如果您知道列的名称,则可以使用df.drop(columns = ['col_name '],inplace = True)-如果您不希望就地执行它,则将其分配给新变量并删除该参数。
Shawn Schreier

78
DF[:-n]

其中n是要删除的最后行数。

要删除最后一行:

DF = DF[:-1]

58

由于Python中的索引定位是基于0的,因此index与相对应的位置实际上没有元素len(DF)。您需要这样last_row = len(DF) - 1

In [49]: dfrm
Out[49]: 
          A         B         C
0  0.120064  0.785538  0.465853
1  0.431655  0.436866  0.640136
2  0.445904  0.311565  0.934073
3  0.981609  0.695210  0.911697
4  0.008632  0.629269  0.226454
5  0.577577  0.467475  0.510031
6  0.580909  0.232846  0.271254
7  0.696596  0.362825  0.556433
8  0.738912  0.932779  0.029723
9  0.834706  0.002989  0.333436

[10 rows x 3 columns]

In [50]: dfrm.drop(dfrm.index[len(dfrm)-1])
Out[50]: 
          A         B         C
0  0.120064  0.785538  0.465853
1  0.431655  0.436866  0.640136
2  0.445904  0.311565  0.934073
3  0.981609  0.695210  0.911697
4  0.008632  0.629269  0.226454
5  0.577577  0.467475  0.510031
6  0.580909  0.232846  0.271254
7  0.696596  0.362825  0.556433
8  0.738912  0.932779  0.029723

[9 rows x 3 columns]

但是,编写起来要简单得多DF[:-1]


2
请注意,使用dfrm.index进行删除时,最后一行的索引应该是唯一的,否则所有具有该索引的行都将被删除。
FranciscoD

我是否正确理解,使用drop(inplace = True)可以修改现有的df,而使用df [:-1]则可以看到数据视图,以后可以导致SettingWithCopyWarning?
菲利普

21

没有人惊讶地提出这一点:

# To remove last n rows
df.head(-n)

# To remove first n rows
df.tail(-n)

对1000行的DataFrame进行速度测试表明,切片和head/ tail的速度比使用drop以下方法快约6倍:

>>> %timeit df[:-1]
125 µs ± 132 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

>>> %timeit df.head(-1)
129 µs ± 1.18 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

>>> %timeit df.drop(df.tail(1).index)
751 µs ± 20.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

也许这两种方法之间的区别在于创建视图head()tail()创建视图,drop()实际上是更改内存中的表示形式(就地修改或创建全新的数据框)。我没有在文档中查找此信息,请有人这样做。(如果是不同的话:perf diff的很好解释,需要在它们之间进行仔细选择)/
Jan-Philip Gehrcke博士

@ Dr.Jan-PhilipGehrcke头headtail并且drop都返回一个观点,虽然这是真的,drop让你修改原始数据框就地选项。
theGirrafish

5
stats = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv")

统计输出:

       A            B          C
0   0.120064    0.785538    0.465853
1   0.431655    0.436866    0.640136
2   0.445904    0.311565    0.934073
3   0.981609    0.695210    0.911697
4   0.008632    0.629269    0.226454
5   0.577577    0.467475    0.510031
6   0.580909    0.232846    0.271254
7   0.696596    0.362825    0.556433
8   0.738912    0.932779    0.029723
9   0.834706    0.002989    0.333436

只是使用 skipfooter=1

skipfooter:int,默认0

文件底部要跳过的行数

stats_2 = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv", skipfooter=1, engine='python')

stats_2的输出

       A          B            C
0   0.120064    0.785538    0.465853
1   0.431655    0.436866    0.640136
2   0.445904    0.311565    0.934073
3   0.981609    0.695210    0.911697
4   0.008632    0.629269    0.226454
5   0.577577    0.467475    0.510031
6   0.580909    0.232846    0.271254
7   0.696596    0.362825    0.556433
8   0.738912    0.932779    0.029723

1

drop返回一个新数组,这就是为什么它在og post中阻塞了;由于将格式错误的csv文件转换为Dataframe,我对重命名某些列标题和删除某些行有类似的要求,因此在阅读本文后,我使用了:

newList = pd.DataFrame(newList)
newList.columns = ['Area', 'Price']
print(newList)
# newList = newList.drop(0)
# newList = newList.drop(len(newList))
newList = newList[1:-1]
print(newList)

而且效果很好,正如您在上面两行注释中看到的那样,我尝试了drop。()方法,它可以工作,但不像使用[n:-n]那样简单易懂,希望对您有所帮助,谢谢。


0

对于具有多索引(例如“股票”和“日期”)且希望删除每个股票的最后一行而不只是最后一个股票的最后一行的更复杂的数据框,解决方案如下:

# To remove last n rows
df = df.groupby(level='Stock').apply(lambda x: x.head(-1)).reset_index(0, drop=True)

# To remove first n rows
df = df.groupby(level='Stock').apply(lambda x: x.tail(-1)).reset_index(0, drop=True)

由于会groupby()为Multi-Index添加一个附加级别,因此我们只需在末尾使用将其删除reset_index()。生成的df与操作之前保持相同的Multi-Index类型。

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.