2017-12-29 4 views
0

Ich habe eine Datenstruktur, die ich Pandas verwende, wo ich die Mindestdaten für einen Plan bekomme. So sieht die Datenstruktur, wie untenPython bekommen Mindestdatum

Engagement ID  Plan Start Date 
A     17-7-2017 
A     18-7-2017 
A     20-7-2017 

ich diese

zu erreichen versuchen
Engagement ID  Plan Start Date Earliest Plan start date 
A     17-7-2017   17-7-2017 
A     18-7-2017   17-7-2017 
A     20-7-2017   17-7-2017 

ich in der Lage war, es zu tun wie dies

engagement_df_earliest_plan_date = engagement_df.loc[engagement_df.groupby('Engagement Id', sort=False)['Plan Start Date'].idxmin()] 
engagement_df_earliest_plan_date = engagement_df_earliest_plan_date[['Engagement Id','Plan Start Date']]; 
engagement_df_earliest_plan_date = engagement_df_earliest_plan_date.rename(columns={'Plan Start Date': 'Earliest Plan Start Date'}); 

aber ich fühle mich nicht elegant genug und fragte mich, ob es einen besseren Weg gibt, Dinge zu tun?

+1

Wie wäre es so etwas wie 'df.groupby ("Engagement ID") [ 'Plan Anfang'] Transformation ('first')'.? –

Antwort

1

Lassen Sie sich eine etwas größere Probe verwenden -

df 

    Engagement ID Plan Start Date 
0    A  17-7-2017 
1    A  18-7-2017 
2    A  20-7-2017 
3    B  21-7-2017 
4    B  22-7-2017 
5    C  29-7-2017 
6    C  30-7-2017 

Bei Bedarf konvertieren Datetime mit pd.to_datetime -

df['Plan Start Date'] = pd.to_datetime(df['Plan Start Date'], errors='coerce') 

, nun dem gewünschten Ausgabe zu erhalten, groupby die erste Spalte und transform mit in Bezug auf die first Reihe in jeder Gruppe -

df['Earliest Plan Start Date'] = \ 
     df.groupby("Engagement ID")['Plan Start Date'].transform('first') 
df 

    Engagement ID Plan Start Date Earliest Plan Start Date 
0    A  2017-07-17    2017-07-17 
1    A  2017-07-18    2017-07-17 
2    A  2017-07-20    2017-07-17 
3    B  2017-07-21    2017-07-21 
4    B  2017-07-22    2017-07-21 
5    C  2017-07-29    2017-07-29 
6    C  2017-07-30    2017-07-29 

Dies ist jedoch möglicherweise nicht ideal, da das erste Datum möglicherweise nicht immer das kleinste ist. Zu diesem Zweck können Sie eine etwas andere Alternative betrachten, mit nsmallest + map -

v = df.groupby("Engagement ID", group_keys=False)['Plan Start Date'].nsmallest(1) 
v.index = v.index.droplevel(1) 
df['Earliest Plan Start Date'] = df['Engagement ID'].map(v) 

Oder

df['Earliest Plan Start Date'] = df['Engagement ID'].replace(v) 
df 

    Engagement ID Plan Start Date Earliest Plan Start Date 
0    A  2017-07-17    2017-07-17 
1    A  2017-07-18    2017-07-17 
2    A  2017-07-20    2017-07-17 
3    B  2017-07-21    2017-07-21 
4    B  2017-07-22    2017-07-21 
5    C  2017-07-29    2017-07-29 
6    C  2017-07-30    2017-07-29 

Nun garantieren Ihnen das früheste Datum . Beachten Sie, dass v wie folgt aussieht -

v 

Engagement ID 
A 2017-07-17 
B 2017-07-21 
C 2017-07-29 
Name: Plan Start Date, dtype: datetime64[ns] 
Verwandte Themen