【问题标题】:Access index of last element in data frame数据框中最后一个元素的访问索引
【发布时间】:2013-03-29 12:39:41
【问题描述】:

我一直在寻找这个,但我似乎找不到它(尽管它一定非常微不足道)。

我遇到的问题是我想为数据框的第一个和最后一个条目检索列的值。但如果我这样做:

df.ix[0]['date']

我明白了:

datetime.datetime(2011, 1, 10, 16, 0)

但如果我这样做:

df[-1:]['date']

我明白了:

myIndex
13         2011-12-20 16:00:00
Name: mydate

使用不同的格式。理想情况下,我希望能够访问数据框的最后一个索引的值,但我找不到方法。

我什至尝试使用索引值创建一个列 (IndexCopy) 并尝试:

df.ix[df.tail(1)['IndexCopy']]['mydate']

但这也会产生不同的格式(因为 df.tail(1)['IndexCopy'] 不输出简单的整数)。

有什么想法吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    以前的答案现在被.iloc取代:

    >>> df = pd.DataFrame({"date": range(10, 64, 8)})
    >>> df.index += 17
    >>> df
        date
    17    10
    18    18
    19    26
    20    34
    21    42
    22    50
    23    58
    >>> df["date"].iloc[0]
    10
    >>> df["date"].iloc[-1]
    58
    

    我能想到的最短方式使用.iget()

    >>> df = pd.DataFrame({"date": range(10, 64, 8)})
    >>> df.index += 17
    >>> df
        date
    17    10
    18    18
    19    26
    20    34
    21    42
    22    50
    23    58
    >>> df['date'].iget(0)
    10
    >>> df['date'].iget(-1)
    58
    

    或者:

    >>> df['date'][df.index[0]]
    10
    >>> df['date'][df.index[-1]]
    58
    

    还有.first_valid_index().last_valid_index(),但取决于您是否要排除NaNs,它们可能不是您想要的。

    请记住,df.ix[0] 不会给您第一个,而是由 0 索引的那个。例如,在上述情况下,df.ix[0] 会产生

    >>> df.ix[0]
    Traceback (most recent call last):
      File "<ipython-input-489-494245247e87>", line 1, in <module>
        df.ix[0]
    [...]
    KeyError: 0
    

    【讨论】:

    • 感谢您的回答。但是,我有另一个数据框,其中 df.ix[0] 似乎给出了数据框的第一行,即使第一个索引不是 0。特别是 df.index[0] 的结果不是 0 ,但 df.ix[df.index[0]] 和 df.ix[0] 确实给出了相同的结果。这是为什么呢?
    • 我需要查看索引,但我怀疑这是因为索引是非数字的,在这种情况下,通过整数 可以 访问就像它是一个索引一样,并且不是钥匙。这是因为如果您要求Something(["A", "B", "C"])[1],您所要求的内容没有歧义,但是如果您有Something([1,2,3,4])[1],您想要什么?阅读 here in the docs 的各个部分,了解其中涉及的一些令人头疼的问题。
    • 如何使用 df['xxx'][df.index[0]] 进行浮点数?我有一个浮点数 56.7888,它被转换为 56 而不是 57
    • 调用iget() 得到'Series' object has no attribute 'iget'
    • 使用pandas 4年,第一次在stackoverflow、教程、代码等任何地方看到iget。
    【解决方案2】:

    Get index of a row of a pandas dataframe as an integer 中结合@comte 的答案和dmdip 的答案

    df.tail(1).index.item()
    

    为您提供索引的值。


    请注意,无论是多索引还是单索引,索引并非总是定义明确。使用索引修改数据框可能会导致意外行为。我们将有一个多索引案例的示例,但请注意,这在单索引案例中也是如此

    假设我们有

    df = pd.DataFrame({'x':[1,1,3,3], 'y':[3,3,5,5]}, index=[11,11,12,12]).stack()
    
    11  x    1
        y    3
        x    1
        y    3
    12  x    3
        y    5              # the index is (12, 'y')
        x    3
        y    5              # the index is also (12, 'y')
    
    df.tail(1).index.item() # gives (12, 'y')
    

    尝试访问索引为df[12, "y"] 的最后一个元素会产生

    (12, y)    5
    (12, y)    5
    dtype: int64
    

    如果您尝试根据索引 (12, y) 修改数据框,您将修改两行而不是一行。因此,即使我们学会了访问最后一行索引的值,如果您想根据其索引更改最后一行的值可能不是一个好主意,因为可能有很多共享同一个索引。在这种情况下,您应该使用df.iloc[-1] 访问最后一行。

    参考

    https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Index.item.html

    【讨论】:

      【解决方案3】:
      df.tail(1).index 
      

      似乎最易读

      【讨论】:

      • 这不会返回一个数字,而是: RangeIndex(start=6, stop=7, step=1)
      • alex:从返回的index中,start=6表示最后一个元素的偏移量。所以,df.tail(1) 获取最后一个元素,df["your_column"][6] 将是最后一个元素,your_column 等(但df.last_valid_index() 只给你数字)
      【解决方案4】:

      现在可能为时已晚,我使用index 方法检索DataFrame 的最后一个索引,然后使用[-1] 获取最后一个值:

      例如,

      df = pd.DataFrame(np.zeros((4, 1)), columns=['A'])
      print(f'df:\n{df}\n')
      
      print(f'Index = {df.index}\n')
      print(f'Last index = {df.index[-1]}')
      

      输出是

      df:
           A
      0  0.0
      1  0.0
      2  0.0
      3  0.0
      
      Index = RangeIndex(start=0, stop=4, step=1)
      
      Last index = 3
      

      【讨论】:

        【解决方案5】:

        您希望 .iloc 带有双括号。

        import pandas as pd
        df = pd.DataFrame({"date": range(10, 64, 8), "not_date": "fools"})
        df.index += 17
        df.iloc[[0,-1]][['date']]
        

        你给 .iloc 一个索引列表——特别是第一个和最后一个,[0, -1]。这将返回一个数据框,您从中请求“日期”列。 ['date'] 会给你一个系列(yuck),[['date']] 会给你一个数据框。

        【讨论】:

          【解决方案6】:

          Pandas 支持 NumPy 语法,它允许:

          df[len(df) -1:].index[0]
          

          【讨论】:

            猜你喜欢
            • 2016-10-29
            • 1970-01-01
            • 1970-01-01
            • 2015-09-25
            • 2016-07-14
            • 1970-01-01
            • 1970-01-01
            • 2021-10-05
            • 2018-02-19
            相关资源
            最近更新 更多