Pandas - манипулирует фреймом данных для создания многоуровневых столбцов - PullRequest
0 голосов
/ 04 октября 2018

Вот кадр данных:

A  B     val  val2  loc
1  march 3    2     NY
1  april 5    1     NY
1  may   12   4     NY
2  march 4    1     NJ
2  april 7    5     NJ
2  may   12   1     NJ
3  march 1    8     CA
3  april 54   6     CA
3  may   2    9     CA

Я хотел бы преобразовать это в:

       march march april april may  may
       val1  val2  val1  val2  val1 val2
A  B   
1  NY  3     5     12   2     1     4
2  NJ  4     7     12   1     5     5
3  CA  1     54    2    8     6     9

Я смотрю в сводные таблицы и стекирование и раскладывание, но я действительно застрял,Я не уверен, с чего начать

1 Ответ

0 голосов
/ 04 октября 2018

При pd.pivot_table и некотором обмене уровнями:

new_df = (pd.pivot_table(df,['val','val2'],['A','loc'],['B'])
          .sort_index(axis=1, level=1)
          .swaplevel(0, axis=1))


>>> new_df
B     april      march      may     
        val val2   val val2 val val2
A loc                               
1 NY      5    1     3    2  12    4
2 NJ      7    5     4    1  12    1
3 CA     54    6     1    8   2    9

Если порядок ваших столбцов важен (как вам нужно, например march, april и may)Вы можете установить его в упорядоченную категориальную категорию:

new_df = (pd.pivot_table(df,['val','val2'],['A','loc'],
                         [pd.Categorical(df.B, categories=['march','april','may'],
                                         ordered=True)])
          .dropna(how='all')
          .sort_index(axis=1, level=1)
          .swaplevel(0, axis=1))

>>> new_df
B     march      april        may     
        val val2   val val2   val val2
A loc                                 
1 NY    3.0  2.0   5.0  1.0  12.0  4.0
2 NJ    4.0  1.0   7.0  5.0  12.0  1.0
3 CA    1.0  8.0  54.0  6.0   2.0  9.0
...