Панды Python, объединяющие данные в несколько столбцов и имена столбцов в другом столбце
У меня есть датафрейм, который я хочу объединить в несколько целевых столбцов. Код ниже я использовал
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
ДО ДФ
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 ответ
Решение
Использование:
set_index
для отдельных столбцов- создать MultiIndex
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
Если только 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