Как извлечь элементы столбца в серии или в фрейме данных? - PullRequest
0 голосов
/ 29 марта 2020

У меня есть столбец объектов в кадре данных, который выглядит следующим образом, когда я проверяю его в своем блокноте через tappers_df['TAP_REOPEN_SCHEDULE']

Изображение блокнота Юпитера

Индекс фрейма данных состоит из строк 'Corp', которые вы видите на изображении. Столбец «TAP_REOPEN_SCHEDULE» в [[двойные скобки]] - это даты, за которыми следуют суммы. Каждый отдельный элемент индекса 'Corp' появляется в списке где-то от 2 до 16 раз и имеет от 1 до 15 пар дата / сумма в столбце 'TAP_REOPEN_SCHEDULE'. Таким образом, для элементов индекса 'Corp', которые появляются дважды, эти строки столбца выглядят следующим образом:

  • AF125751 Corp [[2015-07-17, 5150.0]]
  • AF125751 Corp [[2015-07-17, 5150.0]]

Для элементов индекса 'Corp', которые появляются три раза, строки выглядят следующим образом:

  • AL997424 Corp [[ 2017-06-01, 1632000.0], [2017-12-07, 1065000]]
  • AL997424 Corp [[2017-06-01, 1632000.0], [2017-12-07, 1065000]]
  • AL997424 Corp [[2017-06-01, 1632000.0], [2017-12-07, 1065000]]

и так далее. Для первых экземпляров каждого элемента индекса 'Corp' я собираю нужные даты и суммы из других столбцов в кадре данных. Для последующих я пытаюсь разбить этот столбец на составные части, чтобы результат выглядел следующим образом (Примечание: здесь я использую '|' только для визуального разграничения двух столбцов)

  • AF125751 Corp [1-е число] | [1-е количество] (опять же, взято из других столбцов)
  • AF125751 Corp 2015-07-17 | 5150.0 (ie, 1-я и только TAP_REOPEN_SCHEDULE пара дата / сумма)
  • AL997424 Corp [1-е число] | [1-е количество] (опять же, взято из других столбцов)
  • AL997424 Corp 2017-06-01 | 1632000.0 (ie, 1-е из 2 пар дата / сумма TAP_REOPEN_SCHEDULE)
  • AL997424 Corp 2017-12-07 | 1065000 (ie, 2-е из 2 пар дата / сумма TAP_REOPEN_SCHEDULE)

Я новичок, поэтому, пожалуйста, укажите c в ваших предложениях. Я пробовал каждую итерацию extract, iloc, loc, np.where и других вещей, которые я могу придумать. Большое спасибо или ваша помощь!

1 Ответ

0 голосов
/ 29 марта 2020

Может ли это сработать для вас?

import pandas as pd
df_dict = {'index': ['AF125751 Corp', 'AL997424 Corp', 'AL997424 Corp'], 
           'TAP_REOPEN_SCHEDULE': [[['2015-07-17', 5150.0]], [['2017-06-01', 1632000.0], ['2017-12-07', 1065000]], 
                                   [['2017-06-01', 1632000.0], ['2017-12-07', 1065000]]]}
df = pd.DataFrame.from_dict(df_dict).set_index('index')
s = df.apply(lambda d: pd.Series(d['TAP_REOPEN_SCHEDULE']), axis=1).stack().reset_index(level=1, drop=True)
df_split = pd.DataFrame(s, columns=['TAP_REOPEN_SCHEDULE'])
pd.DataFrame(df_split['TAP_REOPEN_SCHEDULE'].values.tolist(), columns=['DATE', 'VALUE'], index=df_split.index)

Код создает Серии из каждого вложенного списка (каждая строка Серии представляет собой пару [дата, значение]), суммирует эти Серии, затем сбрасывает MultiIndex создан в процессе укладки. Это приводит к объекту Series. Затем он воссоздает объект DataFrame, аналогичный тому, который был у вас в начале.

Кстати, вы также можете удалить повторяющиеся строки, прежде чем делать все это, выполнив:

df[~df.index.duplicated()]['TAP_REOPEN_SCHEDULE']
...