Сводная таблица Pandas

#python #pandas #pivot-table #multi-index

#python #pandas #сводная таблица #многоиндексный

Вопрос:

У меня есть фрейм данных Pandas со следующими столбцами:

 SecId   Date           Sector     Country
184149  2019-12-31     Utility    USA
184150  2019-12-31     Banking    USA
187194  2019-12-31     Aerospace  FRA
...............
128502  2020-02-12     CommSvcs   UK
...............
  

Столбцы SecID и Date являются индексами. Чего я хочу, так это следующего..

 SecId   Date          Aerospace Banking CommSvcs ........  Utility AFG CAN .. FRA .... UK   USA ...
184149  2019-12-31        0        0       0                  1     0   0      0        0    1
184150  2019-12-31        0        1       0                  0     0   0      0        0    1
187194  2019-12-31        1        0       0                  0     0   0      1        0    0
................
128502  2020-02-12        0        0       1                  0     0   0      0        1    0
................
  

Каков эффективный способ сделать это? Исходные данные денормализованы для каждого дня и могут содержать миллионы строк.

Комментарии:

1. Проверьте pandas.get_dummies

2. Если вам нужно иметь возможность повторить шаги с другим набором данных, чтобы получить тот же макет столбца, я бы не стал использовать pandas.get_dummies . В этом случае вы можете использовать класс one-hot-encoder в scikit-learn. Но если вам действительно нужно сделать это один раз, get_dummies это самый простой и быстрый способ сделать это.

Ответ №1:

Вы можете использовать get_dummies . Вы можете использовать категориальный dtype заранее, чтобы определить, какие столбцы будут созданы.

код:

 SECTORS = df.Sector.unique()
df["Sector"] = df.Sector.astype(pd.Categorical(SECTORS))
COUNTRIES = df.Country.unique()
df["Country"] = df.Country.astype(pd.Categorical(COUNTRIES))

df2 = pd.get_dummies(data=df, columns=["Sector", "Country"], prefix="", pefix_sep="")
  

вывод:

     SecId        Date  Aerospace  Banking  Utility  FRA  USA
0  184149  2019-12-31          0        0        1    0    1
1  184150  2019-12-31          0        1        0    0    1
2  187194  2019-12-31          1        0        0    1    0
  

Ответ №2:

Попробуйте, как предлагает @BEN_YO:

 pd.get_dummies(df,columns=['Sector', 'Country'], prefix='', prefix_sep='')
  

Вывод:

     SecId        Date  Aerospace  Banking  Utility  FRA  USA
0  184149  2019-12-31          0        0        1    0    1
1  184150  2019-12-31          0        1        0    0    1
2  187194  2019-12-31          1        0        0    1    0