Панды: сводить и выравнивать столбцы путем объединения имен индекса и столбцов - PullRequest
0 голосов
/ 11 ноября 2018

Я хотел бы повернуть информационный фрейм в Pandas. Я следую за документом здесь: https://pandas.pydata.org/pandas-docs/stable/reshaping.html

С этого кадра данных:

         date variable     value
0  2000-01-03        A  0.469112
1  2000-01-04        A -0.282863
2  2000-01-05        A -1.509059
3  2000-01-03        B -1.135632
4  2000-01-04        B  1.212112
5  2000-01-05        B -0.173215
6  2000-01-03        C  0.119209
7  2000-01-04        C -1.044236
8  2000-01-05        C -0.861849
9  2000-01-03        D -2.104569
10 2000-01-04        D -0.494929
11 2000-01-05        D  1.071804

Бег df.pivot(index='date', columns='variable', values='value')

даст мне это:

variable           A         B         C         D
date                                              
2000-01-03  0.469112 -1.135632  0.119209 -2.104569
2000-01-04 -0.282863  1.212112 -1.044236 -0.494929
2000-01-05 -1.509059 -0.173215 -0.861849  1.071804

Я получаю мультидексный фрейм данных. Изображение может быть лучше, чтобы описать, что происходит:

enter image description here

Однако я бы хотел сделать это:

enter image description here

Все подходы, которые я смог найти, чтобы сгладить мультииндекс, в итоге дают мне foo и bar в разных рядах. Не могли бы вы помочь мне здесь?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Хорошо, после нескольких часов интенсивного поиска, вот простое решение, которое я нашел:

df.columns = [col[0] + f"_r{col[1]}" for col in df.columns]
0 голосов
/ 11 ноября 2018

Полагаю, вам нужно add_prefix для изменения имен столбцов, затем удалите column.name на rename_axis и для столбца из индекса добавьте reset_index:

df1 = df.pivot(index='date', columns='variable', values='value')

df1 = df1.add_prefix(df1.columns.name + '_').rename_axis(None, axis=1).reset_index()
print (df1)
         date  variable_A  variable_B  variable_C  variable_D
0  2000-01-03    0.469112   -1.135632    0.119209   -2.104569
1  2000-01-04   -0.282863    1.212112   -1.044236   -0.494929
2  2000-01-05   -1.509059   -0.173215   -0.861849    1.071804

EDIT:

Если нужно сгладить MultiIndex в столбцах, используйте list comprehension:

mux = pd.MultiIndex.from_product([["A", "B", "C", "D"], ["X", "Y"]])
df = pd.DataFrame([np.arange(8)], columns=mux)
print(df)
   A     B     C     D   
   X  Y  X  Y  X  Y  X  Y
0  0  1  2  3  4  5  6  7

df.columns = [f"{a}_r{b}" for a, b in df.columns]
print (df)
   A_rX  A_rY  B_rX  B_rY  C_rX  C_rY  D_rX  D_rY
0     0     1     2     3     4     5     6     7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...