我有一个数据框,我想将数据融合到多个目标列中。我使用的代码如下
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
请告知解决方案。我已经看到了其他问题,但他们没有将列名称分成单独的列
答案 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
如果只有6MO
和12MO
值以及列的排序很重要:
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