python pandas set_index()とreset_index()


1、pandas.DataFrame.set_index()
DataFrame.set_Index(keys,drop=True,append=False,inplace=False,verify_integrity=False)データFrameのカラムを行インデックスに変換
例を挙げて説明する
>df = pd.DataFrame.from_dict({"a":[1,1], "b":[2,2], "c":[3,3]})
>print(df) 
  
   a  b  c
0  1  2  3
1  1  2  3

いずれかの列を行インデックスに変更します.たとえば、「a」
>df1 = df.set_index("a")
>print(df1)
  
   b  c
a      
1  2  3
1  2  3

複数のカラムをローインデックスにすることもできます
>df2 = df.set_index(["a","b"])
>print(df2)
  
     c
a b   
1 2  3
  2  3

2、DataFrame.reset_index()
DataFrame.reset_index(level=None,drop=False,inplace=False,col_level=0,col_fill=")1、Data Frameのインデックスをリセットし、デフォルトのインデックスを使用します.2.DataFrameに複数のロー・インデックスがある場合、このメソッドでは、ロー・インデックスを列にする1つ以上のロー・インデックス・レベルを削除できます.3、パラメータ説明level:行インデックスから指定されたインデックスレベルのみを削除し、デフォルトではすべてのレベルを削除します.levelは元のdfのindexのレベルで、数値/名前で表すことができます.数値で表す場合、0は1行目のインデックス、1は2行目のインデックスとなります.drop:True/Falseは、解放されたローインデックスが、カラムになった後に削除されるかどうかを示します.col_level:解放されたローインデックスをカラムとして指定したカラムレベルの位置に挿入します.デフォルトでは、最初のレイヤに挿入されます.col_levelはカラムのレベルを表します.col_Fill:解放されたローインデックスをカラムとして指定したカラムレベルの位置に挿入し、カラム名を設定します.設定されていない場合は、ローインデックス名を繰り返します.
例を挙げて説明する
>df2
  
     c
a b   
1 2  3
  2  3

df 2のローインデックスは、「a」と「b」の2段階であることがわかる.階層を名前で表すと、level=‘a’、level=‘b’となります.階層を数字で表すと、レベル=0とレベル=1になります
#               df         
>print(df2.index.levels)
  
[[1], [2]]
   2    

行インデックス「b」を列に変更し、その列を保持します.行インデックス「b」のレベルはlevel=1です.
>df2_1 = df2.reset_index(level=1) #level="b" level=1    
>print(df2_1)
  
   b  c
a      
1  2  3
1  2  3
>df2_2 = df2.reset_index(level=1, drop=True)  #     
>print(df2_2)
  
   c
a   
1  3
1  3

最もよく使われる場所df.reset_index()は一般的にdf.groupby().apply(lambda x: (x))と組み合わせて使われています.私たちはデータ処理を行うとき、よくデータをグループ化して操作し、各グループ内のデータに対してこのような集約計算を行い、df.groupby().apply(lambda x: (x))の組み合わせを使用します.groupbyを使用してdfをグループ化し、いくつかのdf_を生成します.sub、そして各パケットdf_subはまたapply(lambda x:関数(x))を使用して操作し、lambda関数が表す操作が新しいdfを生成する場合、groupby以降のdfは2つの行インデックスを持ち、1つは自分がもともと持っていたもので、1つはapply()が生成したものである.
しかしapply(関数)が生成するローインデックスは、実際の用途がなく、削除する必要があり、reset_を使用します.index()の具体的な使用方法は以下の通りです.
#      df,        ,   score    ,             
df_result_tmp = df.groupby("score").apply(lambda x: trans(x, list_1))
df_result = df_result_tmp.reset_index(level=1, drop=True)
# df_result         。

ここで、関数transは、実際のビジネスニーズに基づいて定義された関数であり、以下のようになります.
def trans(df_sub, list_1):
	#   :df_sub   df  groupby       ;list_1      
	#   :    df_sub_new
    return pd.DataFrame.from_dict(
	{"A": df_sub[df_sub["label"] == "A"].shape[0] * 1.0 / df_sub.shape[0],
	"B": df_sub[df_sub["label"] == "B"].shape[0] * 1.0 / df_sub.shape[0]
	}, orient='index').T
    #        ,   key      ,     pd.DataFrame.from_dict(marix_dict, orient='columns')     ,      orient='index',       。

上記の例では、apply(lambda x: trans(x, list_1))のtrans関数は、各パケットの後のdf_subは操作を行い、新しいdf_を生成した.sub_new,このときdf_sub_newにはデフォルトのindexがあります.これによりdf_result_tmpには、次の2つの行インデックスがあります.
>print(df_result_tmp)

                        A            B  
score                                                                        
[0, 439)       0      0.0000      0.0000
[439, 459)     0      0.0000      0.0000
[459, 479)     0      0.0443      0.0000
[479, 499)     0      0.7884      0.0000
[499, 520)     0      0.1547      0.0275
[520, 999)     0      0.0093      0.7970

1行のインデックスはscoreで、インデックスレベルlevel=0です.もう1つのロー・インデックスは、すべて0のカラムであり、インデックス・レベルlevel=1です.実際に我々が使用する場合,level=1のローインデックスは不要であるため,削除する必要があり,保持すると後続の操作に不可知な影響を及ぼす可能性がある.ここでreset_が必要ですindex()関数です.
>df_result = df_result_tmp.reset_index(level=1, drop=True)
>print(df_result)

                 A            B  
score                                                                        
[0, 439)       0.0000      0.0000
[439, 459)     0.0000      0.0000
[459, 479)     0.0443      0.0000
[479, 499)     0.7884      0.0000
[499, 520)     0.1547      0.0275
[520, 999)     0.0093      0.7970