【问题标题】:start index at 1 for Pandas DataFramePandas DataFrame 的起始索引为 1
【发布时间】:2013-12-08 16:40:51
【问题描述】:

在将 Pandas DataFrame 写入 CSV 时,我需要索引从 1 而不是 0 开始。

这是一个例子:

In [1]: import pandas as pd

In [2]: result = pd.DataFrame({'Count': [83, 19, 20]})

In [3]: result.to_csv('result.csv', index_label='Event_id')                               

产生以下输出:

In [4]: !cat result.csv
Event_id,Count
0,83
1,19
2,20

但我想要的输出是这样的:

In [5]: !cat result2.csv
Event_id,Count
1,83
2,19
3,20

我意识到这可以通过将移位 1 的整数序列作为一列添加到我的数据框中来完成,但我是 Pandas 的新手,我想知道是否存在更简洁的方法。

【问题讨论】:

    标签: python pandas csv dataframe indexing


    【解决方案1】:

    在写入 CSV 之前设置索引。

    df.index = np.arange(1, len(df))
    

    然后正常写。

    【讨论】:

    • 其中 np 是这样导入的:import numpy as np
    • 应该是 df.index = arange( 1, len(df) + 1)
    • 高效方式:df.index = range(1, df.shape[0] + 1)
    【解决方案2】:

    索引是一个对象,默认索引从0开始:

    >>> result.index
    Int64Index([0, 1, 2], dtype=int64)
    

    您可以通过1 移动此索引

    >>> result.index += 1 
    >>> result.index
    Int64Index([1, 2, 3], dtype=int64)
    

    【讨论】:

    • 它以某种方式改变了索引名称 - 所以正确的命名顺序是:df.index+=1;df.index.name='name'
    【解决方案3】:

    来源:In Python pandas, start row index from 1 instead of zero without creating additional column

    工作示例:

    import pandas as pdas
    dframe = pdas.read_csv(open(input_file))
    dframe.index = dframe.index + 1
    

    【讨论】:

      【解决方案4】:

      一行中的另一种方式:

      df.shift()[1:]
      

      【讨论】:

      • 这会删除最后一行。
      【解决方案5】:

      这对我有用

       df.index = np.arange(1, len(df)+1)
      

      【讨论】:

        【解决方案6】:

        你可以用这个:

        import pandas as pd
        
        result = pd.DataFrame({'Count': [83, 19, 20]})
        result.index += 1
        print(result)
        

        或者这个,通过像这样获得numpy库的帮助:

        import pandas as pd
        import numpy as np
        
        result = pd.DataFrame({'Count': [83, 19, 20]})
        result.index = np.arange(1, len(result)+1)
        print(result)
        

        np.arange 将创建一个 numpy 数组并在给定的间隔内返回值,即(1, len(result)+1),最后您将该数组分配给result.index

        【讨论】:

          【解决方案7】:

          从原始答案中分叉,给一些美分:

          • 如果我没记错的话,从0.23版本开始,索引对象是RangeIndex类型

          来自official doc

          RangeIndexInt64Index 的一种节省内存的特殊情况,仅限于表示单调范围。在某些情况下,使用RangeIndex 可能会提高计算速度

          在索引范围很大的情况下,使用索引的表示而不是一次定义整个索引(节省内存)是有意义的。

          因此,举个例子(使用Series,但也适用于DataFrame):

          >>> import pandas as pd
          >>> 
          >>> countries = ['China', 'India', 'USA']
          >>> ds = pd.Series(countries)
          >>> 
          >>>
          >>> type(ds.index)
          <class 'pandas.core.indexes.range.RangeIndex'>
          >>> ds.index
          RangeIndex(start=0, stop=3, step=1)
          >>> 
          >>> ds.index += 1
          >>> 
          >>> ds.index
          RangeIndex(start=1, stop=4, step=1)
          >>> 
          >>> ds
          1    China
          2    India
          3      USA
          dtype: object
          >>> 
          

          如您所见,index 对象的增量改变了startstop 参数。

          【讨论】:

            【解决方案8】:

            使用这个

            df.index = np.arange(1, len(df)+1)
            

            【讨论】:

              【解决方案9】:

              在我看来,最好的办法是使用RangeIndex 设置索引

              import pandas as pd
              
              result = pd.DataFrame({'Count': [83, 19, 20]}, 
                                    index=pd.RangeIndex(start=1, stop=4, name='index')
                                   )
              >>> result
                     Count
              index       
              1         83
              2         19
              3         20
              

              我更喜欢这个,因为您可以在一行中为索引定义范围和可能的stepname

              【讨论】:

                【解决方案10】:

                这会添加一个完成您想要的列

                df.insert(0,"Column Name", np.arange(1,len(df)+1))
                

                【讨论】:

                  猜你喜欢
                  • 2021-09-13
                  • 1970-01-01
                  • 2019-04-13
                  • 1970-01-01
                  • 2018-06-18
                  • 1970-01-01
                  • 2022-08-08
                  相关资源
                  最近更新 更多