Преобразовать список Python повторяющихся записей / значений даты в Pandas Dataframe, отсортированный по дате - PullRequest
0 голосов
/ 11 января 2019

Как я могу преобразовать список из нескольких записей, дат и значений в кадр данных Pandas на основе даты? Например:

С учетом следующего списка:

list_ex = [{'Date': '12/31/2018', 'A': 'N/A'}, 
{'Date': '09/30/2018', 'A': '$5.75'}, 
{'Date': '06/30/2018', 'A': '$5.07'}, 
{'Date': '03/31/2018', 'A': '$3.27'}, 
{'Date': '12/31/2018', 'B': 'N/A'}, 
{'Date': '09/30/2018', 'B': '$56,576.00'}, 
{'Date': '06/30/2018', 'B': '$52,886.00'}, 
{'Date': '03/31/2018', 'B': '$51,042.00'}]

Как мы можем преобразовать это в Dataframe, который выглядит следующим образом (также, где будет 4 или 5 дополнительных столбцов к этому):

        Date      A             B
0  2018-12-31     N/A         N/A
1  2018-09-30   $5.75         $56,576.00
2  2018-06-30   $5.07         $52,886.0
3  2018-03-31   $3.27         $51,042.00

Я выполнил несколько поисков, но не смог найти примеров, которые могли бы помочь с этим. Следовательно, я сделал две неудачные попытки, но не приблизился к желаемому результату.

Попытка 1: я преобразовал значения строк в даты, а затем надеялся, что создание фрейма данных будет «автоматически» группироваться по дате, но это, очевидно, не сработало, поскольку каждое новое дополнение имеет новый индекс. Попытка 1 привела к тому же (в основном) df.

for i in list_ex:
i['Date'] = datetime.datetime.strptime(i['Date'], '%m/%d/%Y')

# Print Pandas dataframe
df = pd.DataFrame(list_ex) 
print(df)  

Попытка 2: сортировка по дате. Это, очевидно, не удалось, поскольку он просто отсортирован по дате и сохранил то же количество строк.

new_df = pd.sort_values('Date')

Спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Вы можете использовать метод groupby() в сочетании с методом .agg следующим образом:

df = pd.DataFrame(list_ex)

df = df.groupby('Date').agg({'A': lambda x: list(x)[0],
                             'B': lambda x: list(x)[1]}).reset_index()

Выход:

    Date        A       B
0   03/31/2018  $3.27   $51,042.00
1   06/30/2018  $5.07   $52,886.00
2   09/30/2018  $5.75   $56,576.00
3   12/31/2018  N/A     N/A
0 голосов
/ 11 января 2019

Возможно, не самый простой или эффективный ответ, но это работает. По сути, я создаю два объекта DataFrame, избавляюсь от всех нанов и затем объединяю их в столбце «Дата».

import pandas as pd

list_ex = [{'Date': '12/31/2018', 'A': 'N/A'},
           {'Date': '09/30/2018', 'A': '$5.75'},
           {'Date': '06/30/2018', 'A': '$5.07'},
           {'Date': '03/31/2018', 'A': '$3.27'},
           {'Date': '12/31/2018', 'B': 'N/A'},
           {'Date': '09/30/2018', 'B': '$56,576.00'},
           {'Date': '06/30/2018', 'B': '$52,886.00'},
           {'Date': '03/31/2018', 'B': '$51,042.00'}]

df1 = pd.DataFrame(data=list_ex, columns=['Date', 'A']).dropna()
df2 = pd.DataFrame(data=list_ex, columns=['Date', 'B']).dropna()

df3 = pd.merge(df1, df2, on='Date')

print(df3)

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...