如何删除pandas数据帧的最后一行数据

Mat*_*ien 68 python pandas

我认为这应该很简单,但我尝试了一些想法,但没有一个有效:

last_row = len(DF)
DF = DF.drop(DF.index[last_row])  #<-- fail!
Run Code Online (Sandbox Code Playgroud)

我尝试使用负指数,但这也导致错误.我仍然必须误解一些基本的东西.

提前致谢.

Kan*_*hew 103

要删除最后n行:

df.drop(df.tail(n).index,inplace=True) # drop last n rows
Run Code Online (Sandbox Code Playgroud)

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

df.drop(df.head(n).index,inplace=True) # drop first n rows
Run Code Online (Sandbox Code Playgroud)

  • 此方法仅在最后一行的索引唯一时才有效,因为它会删除与最后 n 行具有相同索引的所有行。@blue-sky 的回答似乎更合适 (5认同)

ely*_*ely 55

由于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]
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,使用dfrm.index删除时,最后一行的索引应该是唯一的,否则将删除具有该索引的所有行. (2认同)

blu*_*sky 51

DF[:-n]
Run Code Online (Sandbox Code Playgroud)

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

要删除最后一行:

DF = DF[:-1]
Run Code Online (Sandbox Code Playgroud)

  • 也许已弃用,因为我收到错误,它正在寻找名为“-1”的列。必须使用`df = df.iloc[:-1]` (11认同)
  • 根据我的测试,这比使用 `.drop()` 至少快 6 倍! (6认同)

the*_*ish 41

没想到没人提这个:

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

# To remove first n rows
df.tail(-n)
Run Code Online (Sandbox Code Playgroud)

在 1000 行的 DataFrame 上运行速度测试表明切片和head/tail比使用快约 6 倍drop

>>> %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)
Run Code Online (Sandbox Code Playgroud)


Nir*_*man 13

我发现的最好的解决方案是(不一定?)做完整的复制

df.drop(df.index[-1], inplace=True)
Run Code Online (Sandbox Code Playgroud)

当然,您可以简单地省略inplace=True创建新的数据框,并且您还可以N通过简单地获取df.index(df.index[-N:]删除最后 N 行) 的切片来轻松删除最后一行。所以这种方式不仅简洁而且非常灵活。


Pet*_*ton 8

只需使用索引

df.iloc[:-1,:]
Run Code Online (Sandbox Code Playgroud)

这就是 iloc 存在的原因。您也可以使用头部或尾部。

  • 考虑扩展您的答案并解释您的解决方案如何以及为何有效 (3认同)

小智 5

stats = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv")
Run Code Online (Sandbox Code Playgroud)

统计输出:

       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
Run Code Online (Sandbox Code Playgroud)

只是使用 skipfooter=1

跳过脚注:整数,默认为 0

要跳过的文件底部的行数

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

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
Run Code Online (Sandbox Code Playgroud)