Tengo el siguiente df

>In [260]: df
>Out[260]:
    size market vegetable  confirm availability
0  Large    ABC    Tomato                   NaN
1  Large    XYZ    Tomato                   NaN
2  Small    ABC    Tomato                   NaN
3  Large    ABC     Onion                   NaN
4  Small    ABC     Onion                   NaN
5  Small    XYZ     Onion                   NaN
6  Small    XYZ     Onion                   NaN
7  Small    XYZ   Cabbage                   NaN
8  Large    XYZ   Cabbage                   NaN
9  Small    ABC   Cabbage                   NaN

1) ¿Cómo obtener el tamaño de una verdura cuyo tamaño es máximo?

Usé groupby en verdura y tamaño para obtener el siguiente df Pero necesito obtener las filas que contienen el recuento máximo de tamaño con verdura

In [262]: df.groupby(['vegetable','size']).count()
Out[262]:                 market  confirm availability
vegetable size
Cabbage   Large       1                     0
          Small       2                     0
Onion     Large       1                     0
          Small       3                     0
Tomato    Large       2                     0
          Small       1                     0

df2['vegetable','size'] = df.groupby(['vegetable','size']).count().apply( some logic )

Df requerido:

  vegetable   size   max_count
0   Cabbage   Small     2
1     Onion   Small     3
2    Tomato   Large     2

2) Ahora puedo decir que 'Col pequeña' está disponible en gran cantidad de df. Por lo tanto, necesito completar la columna de disponibilidad de confirmación con un pequeño para todas las filas de repollo ¿Cómo hacer esto?

    size market vegetable  confirm availability
0  Large    ABC    Tomato                   Large
1  Large    XYZ    Tomato                   Large
2  Small    ABC    Tomato                   Large
3  Large    ABC     Onion                   Small
4  Small    ABC     Onion                   Small
5  Small    XYZ     Onion                   Small
6  Small    XYZ     Onion                   Small
7  Small    XYZ   Cabbage                   Small    
8  Large    XYZ   Cabbage                   Small    
9  Small    ABC   Cabbage                   Small
1
Er Bharath Ram 9 sep. 2018 a las 12:19

3 respuestas

La mejor respuesta

1)

required_df = veg_df.groupby(['vegetable','size'], as_index=False)['market'].count()\
         .sort_values(by=['vegetable', 'market'])\
         .drop_duplicates(subset='vegetable', keep='last')

2)

merged_df = veg_df.merge(required_df, on='vegetable')
cols = ['size_x', 'market_x', 'vegetable', 'size_y']
dict_renaming_cols = {'size_x': 'size', 
                      'market_x': 'market',
                      'size_y': 'confirm_availability'}
merged_df = merged_df.loc[:,cols].rename(columns=dict_renaming_cols)
2
Antonio Andrés 9 sep. 2018 a las 14:48

Puede asignar el marco de datos agrupado a otro objeto, luego puede hacer otra agrupación en el índice de 'Vegetal' para obtener el valor máximo requerido

d = df.groupby(['vegetable','size']).count()
d.groupby(d.index.get_level_values(0).tolist()).apply(lambda x:x[x.confirm == x.confirm.max()])

Fuera:

                     market confirm availability
vegetable   size            
Cabbage Cabbage Small   2   2   0
Onion   Onion   Small   3   3   0
Tomato  Tomato  Large   2   2   0
1
Naga Kiran 9 sep. 2018 a las 10:29

Puede GroupBy con count, luego ordenar y soltar duplicados:

res = df.groupby(['size', 'vegetable'], as_index=False)['market'].count()\
        .sort_values('market', ascending=False)\
        .drop_duplicates('vegetable')

print(res)

    size vegetable  market
4  Small     Onion       3
2  Large    Tomato       2
3  Small   Cabbage       2
1
jpp 9 sep. 2018 a las 11:02