我认为这应该很简单,但我尝试了几个想法,都没有奏效:
last_row = len(DF) DF = DF.drop(DF.index[last_row]) #<-- fail!
我尝试使用负指数,但这也导致了错误。我一定还是误解了一些基本的东西。
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
2mbi3lxu2#
DF[:-n]
其中n是要删除的最后行数。
要删除最后一行:
DF = DF[:-1]
pepwfjgg3#
由于Python中的索引定位是从0开始的,因此index中与len(DF)对应的位置实际上不会有元素。你需要它是last_row = len(DF) - 1:
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]要简单得多。
DF[:-1]
7d7tgy0s4#
令人惊讶的是,没有人提出这个问题:
# To remove last n rows df.head(-n) # To remove first n rows df.tail(-n)
在1000行的DataFrame上运行速度测试表明,切片和head/tail比使用drop快约6倍:
head
tail
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)
guykilcj5#
只需使用索引
df.iloc[:-1,:]
这就是iloc存在的原因。你也可以用头或尾。
ogsagwnx6#
我发现的最好的解决方案不是(必然的?)执行完整复制是
df.drop(df.index[-1], inplace=True)
当然,您可以简单地省略inplace=True来创建一个新的 Dataframe ,也可以通过简单地获取df.index的片段(df.index[-N:]来删除最后N行)来轻松地删除最后N行。因此,这种方法不仅简洁,而且非常灵活。
df.index[-N:]
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=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
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]那样易读,希望这能帮助某人,谢谢。
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保持与操作前相同类型的多索引。
groupby()
reset_index()
ctehm74n10#
你知道吗,你只需要在第一行给出-1,就像这样
last_row = len(DF) - 1 DF = DF.drop(DF.index[last_row])
10条答案
按热度按时间xienkqul1#
要删除最后n行,请执行以下操作:
按照同样的思路,您可以删除前n行:
2mbi3lxu2#
其中n是要删除的最后行数。
要删除最后一行:
pepwfjgg3#
由于Python中的索引定位是从0开始的,因此
index
中与len(DF)
对应的位置实际上不会有元素。你需要它是last_row = len(DF) - 1
:但是,只编写
DF[:-1]
要简单得多。7d7tgy0s4#
令人惊讶的是,没有人提出这个问题:
在1000行的DataFrame上运行速度测试表明,切片和
head
/tail
比使用drop
快约6倍:guykilcj5#
只需使用索引
这就是iloc存在的原因。你也可以用头或尾。
ogsagwnx6#
我发现的最好的解决方案不是(必然的?)执行完整复制是
当然,您可以简单地省略inplace=True来创建一个新的 Dataframe ,也可以通过简单地获取df.index的片段(
df.index[-N:]
来删除最后N行)来轻松地删除最后N行。因此,这种方法不仅简洁,而且非常灵活。z2acfund7#
统计数据的输出:
只需使用
skipfooter=1
即可Skipfooter:int,默认为0
文件底部要跳过的行数
STATS_2输出
hsvhsicv8#
Drop返回一个新数组,这就是它在og Post中阻塞的原因;由于格式错误的CSV文件转换为Dataframe,我有一个类似的要求重命名一些列标题并删除了一些行,所以在阅读这篇文章后,我使用了:
它工作得很好,正如您在上面的两行注解掉的代码中所看到的那样,我尝试了Drop.()方法,它工作得不像使用[n:-n]那么好,也不像使用[n:-n]那样易读,希望这能帮助某人,谢谢。
2nc8po8w9#
对于具有多索引的更复杂的DataFrame(比如“Stock”和“Date”),并且希望删除每个Stock的最后一行,而不仅仅是最后Stock的最后一行,则解决方案如下:
由于
groupby()
正在向多索引添加一个额外的级别,因此我们只需使用reset_index()
将其删除。生成的DF保持与操作前相同类型的多索引。ctehm74n10#
你知道吗,你只需要在第一行给出-1,就像这样