Как я могу получить первый реестр с типом A и первый реестр с типом B и переместить его в одну строку - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь использовать python и pandas, чтобы получить первый реестр с типом A или B и первый реестр с типом C или D и переместить его в одну строку. Я хочу это за Id.

Мне будет легко продемонстрировать на этом примере

Id,type,Datetime 1, A, 2018-01-01 1, I, 2018-01-02 1, I, 2018-01-03 1, C, 2018-01-04 2, I, 2018-01-01 2, B, 2018-01-02 2, J, 2018-01-03 2, K, 2018-01-04 2, D, 2018-01-05 2, C, 2018-01-06 3, A, 2018-01-03 3, D, 2018-01-09 4, A, 2018-01-03 4, D, 2018-01-05 4, C, 2018-01-04

Я хотел, чтобы результат обработки был

Id, ProcessEvent, ProcessDate, DispatchedEvent, DispatchedDate 1, A, 2018-01-01, C, 2018-01-04 2, B, 2018-01-01, D, 2018-01-05 3, A, 2018-01-03, D, 2018-01-09 4, A, 2018-01-03, C, 2018-01-04

В настоящее время я пытаюсь сделать это, используя python и pandas в кластере Databricks, но я открываюсь для других идей, которые мне нужны, в файлах, которые достигают всего нескольких ТБ, поэтому это большой набор данных, поэтому скорость должна помните, и я не могу сохранить весь набор данных в памяти.

1 Ответ

0 голосов
/ 10 ноября 2018

Первый фильтр по isin и boolean indexing, удаление дубликатов по drop_duplicates для столбца Id, установка индекса и rename имена столбцов:

df['Datetime'] = pd.to_datetime(df['Datetime'])
df = df.sort_values(['Id','Datetime'])

df1 = (df[df['type'].isin(['A','B'])]
          .drop_duplicates('Id')
          .set_index('Id')
          .rename(columns={'type':'ProcessEvent','Datetime':'ProcessDate'}))
df2 = (df[df['type'].isin(['C','D'])]
          .drop_duplicates('Id')
          .set_index('Id')
          .rename(columns={'type':'DispatchedEvent','Datetime':'DispatchedDate'}))

Последний concat вместе:

df = pd.concat([df1, df2], axis=1).reset_index()
print (df)
   Id ProcessEvent ProcessDate DispatchedEvent DispatchedDate
0   1            A  2018-01-01               C     2018-01-04
1   2            B  2018-01-02               D     2018-01-05
2   3            A  2018-01-03               D     2018-01-09
3   4            A  2018-01-03               C     2018-01-04
...