Панды: Расширить столбец, содержащий JSON-массив наблюдений, в строки - PullRequest
0 голосов
/ 27 апреля 2018

Как идиоматический способ Панды расширить столбец, содержащий JSON-массив наблюдений, в дополнительные строки?

В приведенном ниже примере Out[3] - это DataFrame, содержащий данные о кредите. Существует один ряд на кредит. Столбцы Loan ID, Start Date, End Date и Amount не меняются в течение срока действия кредита. Ноль или более платежей с отметкой даты кодируются в столбец Payments в виде массива JSON (строка).

Jupyter screenshot

Целевой вывод в Out[5] показывает цель. Одна или несколько строк на исходную строку с каждым платежом от Payments, приводящим к созданию новой строки в выходных данных.

Я сделал это двумя способами: с iterrows, который выглядит вменяемым и легким для чтения, и с запутанным, несколько волнистым подходом, где я вытягиваю фиксированные атрибуты в индекс, чтобы сохранить их, затем melt и переиндексировать.

Должен быть лучший способ! Пожалуйста, поделитесь секретами мастеров панд:)

1 Ответ

0 голосов
/ 27 апреля 2018

Сначала удалите NaN с в столбце Payments на dropna и конвертируйте json с в dict с на ast.literal_eval:

import ast

s = df['Payments'].dropna().apply(ast.literal_eval)
print (s)
0    [{'Payment Amount': 1000, 'Payment Date': '201...
Name: Payments, dtype: object

Затем преобразуйте каждое значение в DataFrame в list comprehension и concat вместе - параметр keys важен для выравнивания по исходным строкам:

df1 = pd.concat([pd.DataFrame(x) for x in s], keys=s.index)
print (df1)
     Payment Amount Payment Date
0 0            1000   2018-03-11
  1            2000   2018-03-13
  2            3000   2018-03-15

Удалить столбец и join к исходному DataFrame, последний для уникального индекса добавить reset_index:

df = df.drop('Payments', 1).join(df1.reset_index(level=1, drop=True)).reset_index(drop=True)
df['Payment Date'] = pd.to_datetime(df['Payment Date'])
print (df)
   LoanId  Start Date    End Date  Amount  Payment Amount Payment Date
0     100  2018-01-01  2021-01-01   10000          1000.0   2018-03-11
1     100  2018-01-01  2021-01-01   10000          2000.0   2018-03-13
2     100  2018-01-01  2021-01-01   10000          3000.0   2018-03-15
3     101  2018-01-02  2021-01-02   20000             NaN          NaT
4     102  2018-01-03  2021-01-03   30000             NaN          NaT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...