#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
Я создал фрейм данных для сохранения акций, составляющих фондовый индекс, с течением времени, выполнив следующие шаги:
1) Сначала я загружаю необработанные данные через поставщика данных и сохраняю в dict
2) Преобразование в фрейм данных для получения:
constituent_pd = pd.DataFrame.from_dict(constituent, orient='index')
index col1 col2 col3 etc...
1/1/92 stockA stockB NA etc...
2/1/92 stockB stockC stockD etc...
3) Преобразует в логический фрейм данных с:
constituent_bol = pd.get_dummies(constituent_pd.stack()).max(level=0).astype(bool)
index stockA stockB stockC etc...
1/1/92 True True False etc...
2/1/92 False True True etc...
Оттуда я пытался найти способ быстро обновить свою таблицу.
Для этого мне нужно было бы повторно преобразовать constitut_bin обратно в исходную форму словаря, объединить его с новым dictionart (для более поздних дат) и перезапустить весь процесс.
step1 = constituent_bol.astype('int32')
step2 = step1[step1 ==1].stack().reset_index().drop(0,1).set_index('level_0')
1/1/92 stockA
1/1/92 stockB
etc...
и я не знаю, как изменить этот длинный фрейм данных, такой как component_pd, чтобы позже получить dic.
Спасибо за любую помощь!
Комментарии:
1. Каков ваш входной словарь?
2. date1: stockA, stockB, … date2: stockB, stockC, stockD,…
Ответ №1:
Проблема в функции max(level=0)
, потерявшей исходные имена столбцов, поскольку она агрегируется по первому уровню.
Итак, закройте то, что вам нужно, это возможное использование GroupBy.cumcount
для счетчика имен новых столбцов:
print (constituent_pd)
col1 col2 col3
index
1/1/92 stockA stockB NaN
2/1/92 stockB stockC stockD
print (pd.get_dummies(constituent_pd.stack()))
stockA stockB stockC stockD
index
1/1/92 col1 1 0 0 0
col2 0 1 0 0
2/1/92 col1 0 1 0 0
col2 0 0 1 0
col3 0 0 0 1
print (pd.get_dummies(constituent_pd.stack()).max(level=0))
stockA stockB stockC stockD
index
1/1/92 1 1 0 0
2/1/92 0 1 1 1
constituent_bol = pd.get_dummies(constituent_pd.stack()).max(level=0).astype(bool)
print (constituent_bol)
stockA stockB stockC stockD
index
1/1/92 True True False False
2/1/92 False True True True
step1 = constituent_bol.astype('int32')
step2 = step1[step1 == 1].stack().reset_index().drop(0,1)
step2 = step2.set_index(['index', step2.groupby('index').cumcount()])['level_1'].unstack()
print (step2)
0 1 2
index
1/1/92 stockA stockB NaN
2/1/92 stockB stockC stockD