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が初めてで、よりクリーンな方法が存在するかどうか疑問に思っています。
インデックスはオブジェクトであり、デフォルトのインデックスは0
から始まります:
>>> result.index
Int64Index([0, 1, 2], dtype=int64)
1
でこのインデックスをシフトできます
>>> result.index += 1
>>> result.index
Int64Index([1, 2, 3], dtype=int64)
Csvに書き込む前にインデックスを設定するだけです。 df.index = np.arange(1, len(df))
そして、普通に書いてください。
これは私のために働いた
df.index = np.arange(1, len(df)+1)
1行での別の方法:
df.shift()[1:]
ソース: In Python pandas、追加の列を作成せずにゼロではなく1から行インデックスを開始
作業例:
import pandas as pdas
dframe = pdas.read_csv(open(input_file))
dframe.index = dframe.index + 1
これを使用できます:
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
に割り当てます。
元の答えから分岐して、いくつかのセントを与えます:
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
パラメーターが変更されます。