如何删除Pandas Dataframe 的最后一行数据

gijlo24d  于 2022-09-21  发布在  其他
关注(0)|答案(10)|浏览(424)

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

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

我尝试使用负指数,但这也导致了错误。我一定还是误解了一些基本的东西。

xienkqul

xienkqul1#

要删除最后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
2mbi3lxu

2mbi3lxu2#

DF[:-n]

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

要删除最后一行:

DF = DF[:-1]
pepwfjgg

pepwfjgg3#

由于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]要简单得多。

7d7tgy0s

7d7tgy0s4#

令人惊讶的是,没有人提出这个问题:


# 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)
guykilcj

guykilcj5#

只需使用索引

df.iloc[:-1,:]

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

ogsagwnx

ogsagwnx6#

我发现的最好的解决方案不是(必然的?)执行完整复制是

df.drop(df.index[-1], inplace=True)

当然,您可以简单地省略inplace=True来创建一个新的 Dataframe ,也可以通过简单地获取df.index的片段(df.index[-N:]来删除最后N行)来轻松地删除最后N行。因此,这种方法不仅简洁,而且非常灵活。

z2acfund

z2acfund7#

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
hsvhsicv

hsvhsicv8#

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]那么好,也不像使用[n:-n]那样易读,希望这能帮助某人,谢谢。

2nc8po8w

2nc8po8w9#

对于具有多索引的更复杂的DataFrame(比如“Stock”和“Date”),并且希望删除每个Stock的最后一行,而不仅仅是最后Stock的最后一行,则解决方案如下:


# 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()正在向多索引添加一个额外的级别,因此我们只需使用reset_index()将其删除。生成的DF保持与操作前相同类型的多索引。

ctehm74n

ctehm74n10#

你知道吗,你只需要在第一行给出-1,就像这样

last_row = len(DF) - 1
DF = DF.drop(DF.index[last_row])

相关问题