web-dev-qa-db-ja.com

Python pandas、追加の列を作成せずにゼロではなく1から行インデックスを開始

私はそのようにインデックスをリセットできることを知っています

df.reset_index(inplace=True)

しかし、これは0からインデックスを開始します。 1から開始したい。追加の列を作成せずに、index/reset_indexの機能とオプションを保持することで、これを行うにはどうすればよいですか?私はnot新しいデータフレームを作成したいので、inplace=Trueはまだ適用されるはずです。

23
Bram Vanroy

新しいインデックス配列を直接割り当てるだけです:

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

例:

In [151]:

df = pd.DataFrame({'a':np.random.randn(5)})
df
Out[151]:
          a
0  0.443638
1  0.037882
2 -0.210275
3 -0.344092
4  0.997045
In [152]:

df.index = np.arange(1,len(df)+1)
df
Out[152]:
          a
1  0.443638
2  0.037882
3 -0.210275
4 -0.344092
5  0.997045

あるいは単に:

df.index = df.index + 1

インデックスがすでに0ベースの場合

[〜#〜] timings [〜#〜]

何らかの理由でreset_indexのタイミングを取ることができませんが、以下は100,000行dfのタイミングです:

In [160]:

%timeit df.index = df.index + 1
The slowest run took 6.45 times longer than the fastest. This could mean that an intermediate result is being cached 
10000 loops, best of 3: 107 µs per loop


In [161]:

%timeit df.index = np.arange(1, len(df) + 1)
10000 loops, best of 3: 154 µs per loop

したがって、reset_indexのタイミングがないと断言することはできませんが、インデックスが既に0ベースである場合、各インデックス値に1を追加するだけで速くなるようです

45
EdChum

以下のようなインデックス範囲を使用して開始値を指定することもできます。 RangeIndexはパンダでサポートされています。

#df.index

デフォルト値が印刷されます(start = 0、stop = lastelement、step = 1)

次のような開始値の範囲を指定できます。

df.index = pd.RangeIndex(start=1, stop=600, step=1)

参照: pandas.RangeIndex

2
hakuna_code