Панды 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
Другие вопросы по тегам