web-dev-qa-db-fra.com

pandas groupby où vous obtenez le maximum d'une colonne et le min d'une autre colonne

J'ai une trame de données comme suit:

user    num1    num2
a       1       1
a       2       2
a       3       3
b       4       4
b       5       5

Je veux une trame de données qui a le minimum de num1 pour chaque utilisateur et le maximum de num2 pour chaque utilisateur.

La sortie doit être comme:

user    num1    num2
a       1       3
b       4       5

Je sais que si je voulais le maximum des deux colonnes, je pourrais simplement faire:

a.groupby('user')['num1', 'num2'].max()

Y a-t-il un équivalent sans avoir à faire quelque chose comme:

series_1 = a.groupby('user')['num1'].min() 
series_2 = a.groupby('user')['num2'].max()

# converting from series to df so I can do a join on user
df_1 = pd.DataFrame(np.array([series_1]).transpose(), index=series_1.index, columns=['num1']) 
df_2 = pd.DataFrame(np.array([series_2]).transpose(), index=series_2.index, columns=['num2'])

df_1.join(df_2)
10
lhay86

Utilisez groupby + agg par dict, il est donc nécessaire de classer les colonnes par subset ou reindex_axis . Dernier ajout reset_index pour convertir index en column si nécessaire.

df = a.groupby('user').agg({'num1':'min', 'num2':'max'})[['num1','num2']].reset_index()
print (df)
  user  num1  num2
0    a     1     3
1    b     4     5

Qu'est-ce que c'est:

df = a.groupby('user').agg({'num1':'min', 'num2':'max'})
                      .reindex_axis(['num1','num2'], axis=1)
                      .reset_index()
print (df)
  user  num1  num2
0    a     1     3
1    b     4     5
10
jezrael