web-dev-qa-db-ja.com

Pandas DataFrameのインデックスを1から開始

Pandas DataFrameをCSVに書き込むときに、インデックスを0ではなく1から開始する必要があります。

以下に例を示します。

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が初めてで、よりクリーンな方法が存在するかどうか疑問に思っています。

43

インデックスはオブジェクトであり、デフォルトのインデックスは0から始まります:

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

1でこのインデックスをシフトできます

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

Csvに書き込む前にインデックスを設定するだけです。 df.index = np.arange(1, len(df))

そして、普通に書いてください。

12
TomAugspurger

これは私のために働いた

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

1行での別の方法:

df.shift()[1:]
5
Imran

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

作業例:

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

これを使用できます:

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に割り当てます。

0
Utku

元の答えから分岐して、いくつかのセントを与えます:

  • 間違っていない場合、バージョン0.23以降、インデックスオブジェクトはRangeIndexタイプです

公式ドキュメント から:

RangeIndexは、Int64Indexのメモリ節約の特殊なケースであり、単調な範囲の表現に制限されています。 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オブジェクトの増分により、startおよびstopパラメーターが変更されます。

0
ivanleoncz