pandas объединить несколько столбцов по группам - PullRequest
0 голосов
/ 04 февраля 2020

С учетом фрейма данных ...

import pandas as pd
import numpy as np

# create some data
data = [['A1','234','1','12/17/2013','5/1/2014','1'],
        ['A1','234','2','2/13/2014','2/13/2014','1'],
        ['A2','532','1','8/4/2015','8/4/2015','2'],
        ['A3','123','1','4/6/2017','8/28/2017','3'],
        ['A4','754','1','4/11/2019','4/11/2019','4'],
        ['A5','754','1','9/20/2019','9/20/2019','5'],
        ['A5','754','2','9/20/2019','9/25/2019','5'],
        ['A5','754','3','9/24/2019','9/24/2019','5'],
        ['A5','754','4','9/25/2019','9/25/2019','5'],
        ['A5','754','5','9/25/2019','9/26/2019','5'],
        ['A5','754','6','9/26/2019','9/26/2019','5'],
        ['A5','754','7','9/27/2019','9/29/2019','5'],
        ['A5','754','8','9/29/2019','10/2/2019','5']]

# create dataframe
df = pd.DataFrame(data,columns=['MemberID','OrgID','RowID','StartDate','StopDate','Group'])

# format as datetime
df["StartDate"] = pd.to_datetime(df["StartDate"],errors ="coerce")
df["StopDate"] = pd.to_datetime(df["StopDate"],errors ="coerce")

Вернуть новый фрейм данных, сгруппировав строки по Group и используя agg, чтобы сохранить самые ранние StartDate и самые последние StopDate, что должно привести к ...

MemberID    OrgID   RowID   StartDate   StopDate    Group
A1           234    1       12/17/2013  5/1/2014     1
A2           532    1       8/4/2015    8/4/2015     2
A3           123    1       4/6/2017    8/28/2017    3
A4           754    1       4/11/2019   4/11/2019    4
A5           754    1       9/20/2019   10/2/2019    5

После нескольких попыток самая близкая, которую я получил, была ...

# groupby
gb = df.groupby(['Group'], as_index=False,group_keys=False)

# aggregate by min and max date
result_df = gb.agg({'StartDate': np.min, 
                    'StopDate': np.max})

Однако, вышеупомянутые удаляют все остальные столбцы

  Group  StartDate     StopDate
     1   2013-12-17   2014-05-01
     2   2015-08-04   2015-08-04
     3   2017-04-06   2017-08-28
     4   2019-04-11   2019-04-11
     5   2019-09-20   2019-10-02

Я знаю, что могу просто удалить даты из исходного кадра данных и объединить их на Group

# copy old df and remove date columns
old_df = df.copy()
del old_df['StartDate']
del old_df['StopDate']

# remove duplicates
old_df.drop_duplicates(subset = ['Group'], keep = 'first', inplace = True)

# merge with agg result
final_df = pd.merge(result_df, old_df, on = "Group", how = "outer")

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

...