2017-09-15 22 views
2

データを複数のターゲット列に溶かしたいデータフレームがあります。以下のコードは、私が複数の列と複数の列に名前をつけるPython pandas

grp2 = pd.lreshape(grp1, cols.groupby(cols.str.split('_').str[1])).sort_values('ACCT_NAME') 

は、上記の行は、私は、列名を失う使用

grp2 = pd.melt(grp1 , id_vars = ['Client' , 'Industry'] , var_name = "H Year" , value_name = 'Count') 

私は複数のターゲット列DF

から

Client INDUSTRY 1H2016_6MO 2H2016_6MO 1H2017_6MO 2H2017_6MO 1H2016_12MO 2H2016_12MO 1H2017_12MO 2H2017_12MO 

XXX  AAA   1   0   0   0   1   1   0   0 

YYY  BBB   0   0   1   0   0   0   0   1 
ZZZ  CCC   1   1   0   0   0   0   1   1 

XXX  AAA   1   0   0   0   1   1   0   0 
を得るいけない上の行
0 DF

Client INDUSTRY Year_Half 6MO 12MO 
XXX  AAA   1H2016  2 2 
XXX  AAA   2H2016  0 2 
XXX  AAA   1H2017  0 0 
XXX  AAA   2H2017  0 0 
YYY  BBB   1H2016  0 0 
YYY  BBB   2H2016  0 0 
YYY  BBB   1H2017  1 0 
YYY  BBB   2H2017  0 1 
ZZZ CCC 1H2016 1 0 
ZZZ CCC 2H2016 1 0 
ZZZ CCC 1H2017 0 1 
ZZZ CCC 2H2017 0 1 

TO

は、これに対する解決策について助言してください。私は他の質問を見てきましたが、彼らは別々の列

に列名を取るいけない

答えて

2

用途:個別の列のための

  • set_index
  • によるマルチインデックスを作成split
  • リシェイプ

stackによって
df = df.set_index(['Client','INDUSTRY']) 
df.columns = df.columns.str.split('_', expand=True) 
df = df.stack(0).reset_index().rename(columns={'level_2':'Year_Half'}) 
print (df) 
    Client INDUSTRY Year_Half 12MO 6MO 
0  XXX  AAA 1H2016  1 1 
1  XXX  AAA 1H2017  0 0 
2  XXX  AAA 2H2016  1 0 
3  XXX  AAA 2H2017  0 0 
4  YYY  BBB 1H2016  0 0 
5  YYY  BBB 1H2017  0 1 
6  YYY  BBB 2H2016  0 0 
7  YYY  BBB 2H2017  1 0 
8  ZZZ  CCC 1H2016  0 1 
9  ZZZ  CCC 1H2017  1 0 
10 ZZZ  CCC 2H2016  0 1 
11 ZZZ  CCC 2H2017  1 0 
12 XXX  AAA 1H2016  1 1 
13 XXX  AAA 1H2017  0 0 
14 XXX  AAA 2H2016  1 0 
15 XXX  AAA 2H2017  0 0 

のみ6MO12MO値と列の順序が重要な場合:

df = df.set_index(['Client','INDUSTRY']) 
df.columns = df.columns.str.split('_', expand=True) 
df = (df.stack(0) 
     .reindex_axis(['6MO','12MO'], 1) 
     .reset_index() 
     .rename(columns={'level_2':'Year_Half'})) 
print (df) 
    Client INDUSTRY Year_Half 6MO 12MO 
0  XXX  AAA 1H2016 1  1 
1  XXX  AAA 1H2017 0  0 
2  XXX  AAA 2H2016 0  1 
3  XXX  AAA 2H2017 0  0 
4  YYY  BBB 1H2016 0  0 
5  YYY  BBB 1H2017 1  0 
6  YYY  BBB 2H2016 0  0 
7  YYY  BBB 2H2017 0  1 
8  ZZZ  CCC 1H2016 1  0 
9  ZZZ  CCC 1H2017 0  1 
10 ZZZ  CCC 2H2016 1  0 
11 ZZZ  CCC 2H2017 0  1 
12 XXX  AAA 1H2016 1  1 
13 XXX  AAA 1H2017 0  0 
14 XXX  AAA 2H2016 0  1 
15 XXX  AAA 2H2017 0  0 
+0

クール....おかげで、それは私のデータセットは、長い範囲を持っているだけであること、その働いたと私は私が持っているレベル4のように列名を得ましたその列をウェルドに変更しました.. –

関連する問題