web-dev-qa-db-ja.com

pandasのdf.reindex()メソッドとdf.set_index()メソッドの違い

私はこれに戸惑いました。これは非常に簡単ですが、StackOverflowですぐに答えが見つかりませんでした。

  • df.set_index('xcol')は、列_'xcol'_をインデックスにします(dfの列の場合)。

  • ただし、df.reindex(myList)は、データフレームの外部、たとえば、別の場所で定義したmyListという名前のリストからインデックスを取得します。

この投稿がそれを明らかにすることを願っています!この投稿への追加も大歓迎です!

11

簡単な例で違いを確認できます。このデータフレームを考えてみましょう:

_df = pd.DataFrame({'a': [1, 2],'b': [3, 4]})
print (df)
   a  b
0  1  3
1  2  4
_

インデックスは0と1です

_set_index_を列 'a'で使用すると、インデックスは1と2になります。df.set_index('a').loc[1,'b']を実行すると、3が得られます。

df.reindex([1,2])などの同じインデックス1と2でreindexを使用する場合、df.reindex([1,2]).loc[1,'b']を実行すると4.0になります

起こったのは、_set_index_が列 'b'の値の順序を変更せずに、以前のインデックス(0,1)を(1,2)(列 'a'の値)に置き換えたことです

_df.set_index('a')
   b
a   
1  3
2  4
_

reindexはインデックスを変更しますが、元のdfのインデックスに関連付けられた列 'b'の値を保持します

_df.reindex(df.a.values).drop('a',1) # equivalent to df.reindex(df.a.values).drop('a',1)
     b
1  4.0
2  NaN
# drop('a',1) is just to not care about column a in my example
_

最後に、reindexは各インデックスに関連付けられた行の値を変更せずにインデックスの順序を変更しますが、_set_index_は他の値の順序を変更せずに列の値でインデックスを変更しますデータフレーム内

14
Ben.T

追加するだけで、 set_indexreset_index メソッド(多かれ少なかれ):

df = pd.DataFrame({'a': [1, 2],'b': [3, 4]})
print (df)

df.set_index('a', inplace=True)
print(df)

df.reset_index(inplace=True, drop=False)
print(df)

   a  b
0  1  3
1  2  4
   b
a   
1  3
2  4
   a  b
0  1  3
1  2  4
3
prosti

ベンからの素晴らしい答えに加えて。 T、reindexset_indexをインデックス列に使用した場合の違いの例をもう1つ挙げたいと思います

import pandas as pd
import numpy as np
testdf = pd.DataFrame({'a': [1, 3, 2],'b': [3, 5, 4],'c': [5, 7, 6]})

print(testdf)
print(testdf.set_index(np.random.permutation(testdf.index)))
print(testdf.reindex(np.random.permutation(testdf.index)))

出力:

  • set_indexを使用すると、index列(最初の列)がシャッフルされると、他の列の順序はそのまま維持されます
  • reindexを使用すると、行の順序はindex列のシャッフルに応じて変更されます。
   a  b  c
0  1  3  5
1  3  5  7
2  2  4  6
   a  b  c
1  1  3  5
2  3  5  7
0  2  4  6
   a  b  c
2  2  4  6
1  3  5  7
0  1  3  5
2
Long