стек, разворот или что-то еще? - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь взять несколько столбцов года и развернуть их в один столбец.

Входные данные выглядят примерно так:

Country 1990 1991
Canada    10   20
Scotland 100  200

, и я хочу что-то вродеэто:

Country Year  Value
Canada   1990    10
Canada   1991    20
Scotland 1990   100
Scotland 1991   200

Есть ли простой способ сделать это? Я чувствую, что я должен быть в состоянии сделать это в одну строку с пандами, но я не могу получить это.

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

Полная проблема в том, что ниже. Можно ли сделать это за один шаг или мне нужно будет выполнить несколько преобразований?

Country  Measure 1990 1991
Canada   M1        10   20
Canada   M2       0.1  0.2
Scotland M1       100  200
Scotland M2         1    2

Мне нужно это:

Country  Year  M1  M2
Canada   1990  10 0.1
Canada   1991  20 0.2
Scotland 1990 100   1
Scotland 1991 200   2

Я пробовал различные комбинации pivot и stack и это не то, что мне нужно.

Ответы [ 3 ]

1 голос
/ 21 октября 2019

Попробуйте melt и pivot_table

df1 = (df.melt(['Country','Measure'], var_name='Year')
         .pivot_table(index=['Country', 'Year'], columns='Measure', values='value')
         .reset_index())

Out[321]:
Measure   Country  Year     M1   M2
0          Canada  1990   10.0  0.1
1          Canada  1991   20.0  0.2
2        Scotland  1990  100.0  1.0
3        Scotland  1991  200.0  2.0
0 голосов
/ 21 октября 2019

это расплав :

new_df=df.melt(id_vars='Country',var_name='Year',value_name='M1').sort_values('M1')
new_df['M2']=new_df['M1']/100
print(new_df)

    Country  Year   M1   M2
0    Canada  1990   10  0.1
2    Canada  1991   20  0.2
1  Scotland  1990  100  1.0
3  Scotland  1991  200  2.0

используемый кадр данных

print(df)

    Country  1990  1991
0    Canada    10    20
1  Scotland   100   200
0 голосов
/ 21 октября 2019

На шаге:

df.set_index(['Country','Measure']).stack().unstack(1).reset_index()

Вывод:

Measure   Country level_1     M1   M2
0          Canada    1990   10.0  0.1
1          Canada    1991   20.0  0.2
2        Scotland    1990  100.0  1.0
3        Scotland    1991  200.0  2.0

Что касается первой проблемы.

df.melt('Country')

Вывод:

    Country variable  value
0    Canada     1990     10
1  Scotland     1990    100
2    Canada     1991     20
3  Scotland     1991    200
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...