Как мне создать MultiIndex Dataframe из объединенной таблицы? - PullRequest
3 голосов
/ 14 мая 2019

Я пытаюсь выполнить анализ на объединенном фрейме данных. В настоящее время мои данные примерно такие:

data2 = pd.DataFrame({'county':['A', 'B', 'C', 'D'],
                    '1990pop': [100, 200, 150, 400],
                     '1990price': [35, 20, 10, 60],
                     '1991pop': [110, 210, 160, 410],
                     '1991price': [7, 9, 8, 15]})
data2.set_index('county')

Я хочу создать MultiIndex, поэтому для каждой строки вы видите округ, а затем в каждом округе есть запись для переменной «население» и «цена», и только один столбец для каждого для каждого года 1990 и 1991

Вот как мне хотелось бы, чтобы датафрейм выглядел

Я пробовал различные руководства по слиянию и MultiIndex, но это немного выходит за рамки моих возможностей. Буду очень признателен за любую помощь!

Ответы [ 3 ]

2 голосов
/ 14 мая 2019

columns.str.extract с regex

data2.set_axis(
    [*data2.columns.str.extract('(\d{4})(.*)').values.T],
    1, inplace=False
).stack().rename_axis(['country', 'type'])

               1990  1991
country type             
A       pop     100   110
        price    35     7
B       pop     200   210
        price    20     9
C       pop     150   160
        price    10     8
D       pop     400   410
        price    60    15
2 голосов
/ 14 мая 2019

Это то, что вам нужно? wide_to_long + unstack + stack

yourdf=pd.wide_to_long(data2,['1990','1991'],i=['county'],j='year',suffix='\w+').unstack().stack(1)
yourdf
Out[57]: 
              1990  1991
county year             
A      pop     100   110
       price    35     7
B      pop     200   210
       price    20     9
C      pop     150   160
       price    10     8
D      pop     400   410
       price    60    15
1 голос
/ 14 мая 2019

Так как годы - это 4 цифры, я бы создал MultiIndex для столбцов, тогда stack:

data2.columns = pd.MultiIndex.from_arrays([data2.columns.str[0:4], data2.columns.str[4:]],
                                          names=[None, 'Type'])
data2.stack(1)

              1990  1991
county Type             
A      pop     100   110
       price    35     7
B      pop     200   210
       price    20     9
C      pop     150   160
       price    10     8
D      pop     400   410
       price    60    15
...