【问题标题】:How to delete the last row of data of a pandas dataframe如何删除熊猫数据框的最后一行数据
【发布时间】:2021-06-04 04:54:01
【问题描述】:

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

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

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

【问题讨论】:

  • DF = DF[:-1]?
  • @U2EF1 这会复制整个数据集,不是吗?在处理大量数据时,这可能是个问题。
  • 如果last_row取DF的长度,则需要使用(last_row-1)进行索引。
  • 最好使用df.shape[0] 而不是len(df) 来获取行数。

标签: python pandas


【解决方案1】:

删除最后 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) - 如果您不希望它就地执行,请将其分配给一个新变量并删除该参数。
  • 此方法仅在最后一行的索引唯一时才有效,因为它会删除与最后 n 行具有相同索引的所有行。 @blue-sky 的回答似乎更合适
【解决方案2】:
DF[:-n]

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

删除最后一行:

DF = DF[:-1]

【讨论】:

  • 这行得通,但我怀疑 Wes McKinney 不会喜欢它。为什么不使用 Pandas 内置的东西?
  • 可能因为我收到一个错误而被弃用,它正在寻找一个名为 -1 的列。不得不使用df = df.iloc[:-1]
【解决方案3】:

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

【讨论】:

  • 请注意,使用 dfrm.index 删除时,最后一行的索引应该是唯一的,否则所有具有该索引的行都会被删除。
  • 我是否理解正确,使用 drop (inplace=True) 可以修改现有的 df,而使用 df[:-1] 可以查看数据,稍后会导致 SettingWithCopyWarning?
【解决方案4】:

很惊讶没有人提出这个:

# 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() 创建一个 viewdrop() 实际上改变了内存中的表示(就地修改,或者创建一个全新的数据框)。我没有在文档中查找此内容,请有人这样做。 (如果这就是区别:对性能差异的很好解释,需要在它们之间仔细选择)/
  • @Dr.Jan-PhilipGehrcke Head headtaildrop 都返回一个视图,尽管 drop 确实为您提供了就地修改原始数据框的选项。
【解决方案5】:

只使用索引

df.iloc[:-1,:]

这就是 iloc 存在的原因。您也可以使用 head 或 tail。

【讨论】:

  • 考虑扩展您的答案并解释您的解决方案的工作原理和原因
【解决方案6】:

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

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

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

【讨论】:

    【解决方案7】:
    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
    

    【讨论】:

      【解决方案8】:

      drop 返回一个新数组,这就是它在 og 帖子中阻塞的原因;由于格式不正确的 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] 那样简洁和可读,希望对某人有所帮助,谢谢。

      【讨论】:

      • 这与已经存在的许多其他答案完全相同。
      【解决方案9】:

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

      # 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 保持与操作前相同类型的 Multi-Index。

      【讨论】:

        【解决方案10】:

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

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

        【讨论】:

          猜你喜欢
          • 2013-12-29
          • 1970-01-01
          • 2020-08-09
          • 2016-05-07
          • 2016-09-15
          • 1970-01-01
          • 2013-04-30
          • 2022-11-08
          • 2017-03-18
          相关资源
          最近更新 更多