python - tablas - obtener el primer y último valor en un grupo por
recorrer data frame pandas (1)
Opción 1
def first_last(df):
return df.ix[[0, -1]]
df.groupby(level=0, group_keys=False).apply(first_last)
Opción 2: solo funciona si el índice es único
idx = df.index.to_series().groupby(level=0).agg([''first'', ''last'']).stack()
df.loc[idx]
Opción 3: según las notas a continuación, esto solo tiene sentido cuando no hay NA
También abusé de la función agg
. El siguiente código funciona, pero es mucho más feo.
df.reset_index(1).groupby(level=0).agg([''first'', ''last'']).stack() /
.set_index(''level_1'', append=True).reset_index(1, drop=True) /
.rename_axis([None, None])
Nota
per @unutbu: agg([''first'', ''last''])
toma los primeros valores no nacionales.
Interpreté esto como, entonces debe ser necesario ejecutar esta columna por columna. Además, forzar el nivel de índice = 1 para alinear puede que ni siquiera tenga sentido.
Vamos a incluir otra prueba
df = pd.DataFrame(np.arange(20).reshape(10, -1),
[list(''aaaabbbccd''),
list(''abcdefghij'')],
list(''XY''))
df.loc[tuple(''aa''), ''X''] = np.nan
def first_last(df):
return df.ix[[0, -1]]
df.groupby(level=0, group_keys=False).apply(first_last)
df.reset_index(1).groupby(level=0).agg([''first'', ''last'']).stack() /
.set_index(''level_1'', append=True).reset_index(1, drop=True) /
.rename_axis([None, None])
¡Bastante seguro! Esta segunda solución está tomando el primer valor válido en la columna X. Ahora no tiene sentido obligar a ese valor a alinearse con el índice a.
Tengo un dataframe df
df = pd.DataFrame(np.arange(20).reshape(10, -1),
[[''a'', ''a'', ''a'', ''a'', ''b'', ''b'', ''b'', ''c'', ''c'', ''d''],
[''a'', ''b'', ''c'', ''d'', ''e'', ''f'', ''g'', ''h'', ''i'', ''j'']],
[''X'', ''Y''])
¿Cómo obtengo la primera y la última fila, agrupadas por el primer nivel del índice?
Lo intenté
df.groupby(level=0).agg([''first'', ''last'']).stack()
y consiguió
X Y
a first 0 1
last 6 7
b first 8 9
last 12 13
c first 14 15
last 16 17
d first 18 19
last 18 19
Esto está muy cerca de lo que quiero. ¿Cómo puedo conservar el índice de nivel 1 y obtener esto en su lugar?
X Y
a a 0 1
d 6 7
b e 8 9
g 12 13
c h 14 15
i 16 17
d j 18 19
j 18 19