Pandas — извлекает исходный фрейм данных из преобразованного фрейма данных

#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