Комплексная группа с использованием Pandas - PullRequest
0 голосов
/ 30 января 2020

Я сталкиваюсь с ситуацией, когда мне нужно сгруппировать по фрейму данных по столбцу «ID», а также рассчитать общий период времени, отображаемый для этого конкретного ID для завершения. Я только хочу рассчитать разницу между date_open и data_closed для конкретного идентификатора с помощью счетчика идентификаторов. Нам нужно только сосредоточиться на дате открытия и поле даты закрытия. Поэтому нужно что-то сделать, взяв максимальную дату закрытия и минимальную дату открытия и вычтя два. Кадр данных выглядит следующим образом:

ID      Date_Open     Date_Closed
1       01/01/2019     02/01/2019
1       07/01/2019     09/01/2019
2       10/01/2019     11/01/2019
2       13/01/2019     19/01/2019
3       10/01/2019     11/01/2019

Вывод должен выглядеть следующим образом:

ID     Count_of_ID     Total_Time_In_Days
1         2                8
2         2                9
3         1                1

Как мне этого добиться?

Ответы [ 3 ]

1 голос
/ 30 января 2020

Использование GroupBy с named_aggregation и min и max дат:

df[['Date_Open', 'Date_Closed']] = (
    df[['Date_Open', 'Date_Closed']].apply(lambda x: pd.to_datetime(x, format='%d/%m/%Y'))
)

dfg = df.groupby('ID').agg(
    Count_of_ID=('ID','size'),
    Date_Open=('Date_Open','min'),
    Date_Closed=('Date_Closed','max')
)

dfg['Total_Time_In_Days'] = dfg['Date_Closed'].sub(dfg['Date_Open']).dt.days
dfg = dfg.drop(columns=['Date_Closed', 'Date_Open']).reset_index()
   ID  Count_of_ID  Total_Time_In_Days
0   1            2                   8
1   2            2                   9
2   3            1                   1

Теперь у нас есть Total_Time_In_Days как int:

print(dfg.dtypes)

ID                    int64
Count_of_ID           int64
Total_Time_In_Days    int64
dtype: object
1 голос
/ 30 января 2020

Это также может быть использовано:

df['Date_Open'] =  pd.to_datetime(df['Date_Open'], dayfirst=True)
df['Date_Closed'] =  pd.to_datetime(df['Date_Closed'], dayfirst=True)
df_grouped = df.groupby(by='ID').count()
df_grouped['Total_Time_In_Days'] = df.groupby(by='ID')['Date_Closed'].max() - df.groupby(by='ID')['Date_Open'].min()
df_grouped = df_grouped.drop(columns=['Date_Open'])
df_grouped.columns=['Count', 'Total_Time_In_Days']
print(df_grouped)


     Count  Total_Time_In_Days
ID      
1      2    8 days
2      2    9 days
3      1    1 days
0 голосов
/ 30 января 2020

Сначала я попытаюсь создать столбец, показывающий, сколько времени прошло с Date_open до Date_closed для каждого экземпляра кадра данных. Например:

df['Total_Time_In_Days'] = df.Date_closed - df.Date_open

Затем вы можете использовать groupby:

df.groupby('id').agg({'id':'count','Total_Time_In_Days':'sum'})

Если вам нужна помощь с функцией .agg, вы можете обратиться к ее официальной документации здесь .

...