データフレームを並べ替えた後にインデックスを更新する


101

次のデータフレームを使用します。

x = np.tile(np.arange(3),3)
y = np.repeat(np.arange(3),3)
df = pd.DataFrame({"x": x, "y": y})
   x  y
0  0  0
1  1  0
2  2  0
3  0  1
4  1  1
5  2  1
6  0  2
7  1  2
8  2  2

x最初に並べ替える必要があり、2番目に並べ替える必要がありますy

df2 = df.sort(["x", "y"])
   x  y
0  0  0
3  0  1
6  0  2
1  1  0
4  1  1
7  1  2
2  2  0
5  2  1
8  2  2

インデックスを再び昇順になるように変更するにはどうすればよいですか。つまり、どうすればこれを取得できますか?

   x  y
0  0  0
1  0  1
2  0  2
3  1  0
4  1  1
5  1  2
6  2  0
7  2  1
8  2  2

私は以下を試しました。残念ながら、インデックスはまったく変更されません。

df2.reindex(np.arange(len(df2.index)))

1
新しいdfが必要ない場合は、試してみてくださいdf.sort(["x", "y"], ignore_index=True, inplace=True)
InnocentBystander

回答:


174

あなたができるリセット使用して索引をreset_index0、1、2のデフォルトのインデックスを取り戻すために、...、N-1(および使用がdrop=Trueあなたの代わりにあなたのデータフレームに追加の列として追加の既存のインデックスをドロップしたい示すために) :

In [19]: df2 = df2.reset_index(drop=True)

In [20]: df2
Out[20]:
   x  y
0  0  0
1  0  1
2  0  2
3  1  0
4  1  1
5  1  2
6  2  0
7  2  1
8  2  2

それはとても役に立ちました。exp_data = exp_data.reindex(['year']、axis = 'columns')は古いインデックスを保持しました。ドロップすると、古いインデックスが削除されます。
ゴールデンライオン


9

pandas 1.0.0にdf.sort_valuesは、ignore_index必要なことを正確に実行する新しいパラメーターがあります。

In [1]: df2 = df.sort_values(by=['x','y'],ignore_index=True)

In [2]: df2
Out[2]:
   x  y
0  0  0
1  0  1
2  0  2
3  1  0
4  1  1
5  1  2
6  2  0
7  2  1
8  2  2

これはバージョン1.0.0の新機能だと思います。
zyy

5

次を使用して、新しいインデックスを設定できますset_index

df2.set_index(np.arange(len(df2.index)))

出力:

   x  y
0  0  0
1  0  1
2  0  2
3  1  0
4  1  1
5  1  2
6  2  0
7  2  1
8  2  2

8
これは不要です。reset_index()代わりに使用してください
smci 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.