Python pandas将数据熔化为多列和另一列中的coulmn名称

时间:2017-09-15 07:56:15

标签: python pandas reshape melt

我有一个数据框,我想将数据融合到多个目标列中。我使用的代码如下

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
  

到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

请告知解决方案。我已经看到了其他问题,但他们没有将列名称分成单独的列

1 个答案:

答案 0 :(得分:2)

使用:

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