#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