usar tablas sumar recorrer promedio para leer funciones datos data como columnas python pandas dataframe group-by pandas-groupby

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