multiple method groupby example every entire column applymap python group-by transform dataframe pandas

python - method - pandas groupby



Python Pandas: cómo agregar una columna totalmente nueva a un marco de datos dentro de una operación groupby/transform (1)

Quiero marcar algunos cuantiles en mis datos, y para cada fila del DataFrame, me gustaría la entrada en una nueva columna llamada, por ejemplo, "xtile" para mantener este valor.

Por ejemplo, supongamos que creo un marco de datos como este:

import pandas, numpy as np dfrm = pandas.DataFrame({''A'':np.random.rand(100), ''B'':(50+np.random.randn(100)), ''C'':np.random.randint(low=0, high=3, size=(100,))})

Y digamos que escribo mi propia función para calcular el quintil de cada elemento en una matriz. Tengo mi propia función para esto, pero por ejemplo solo me refiero a scipy.stats.mstats.mquantile.

import scipy.stats as st def mark_quintiles(x, breakpoints): # Assume this is filled in, using st.mstats.mquantiles. # This returns an array the same shape as x, with an integer for which # breakpoint-bucket that entry of x falls into.

Ahora, la verdadera pregunta es cómo usar la transform para agregar una nueva columna a los datos. Algo como esto:

def transformXtiles(dataFrame, inputColumnName, newColumnName, breaks): dataFrame[newColumnName] = mark_quintiles(dataFrame[inputColumnName].values, breaks) return dataFrame

Y entonces:

dfrm.groupby("C").transform(lambda x: transformXtiles(x, "A", "A_xtile", [0.2, 0.4, 0.6, 0.8, 1.0]))

El problema es que el código anterior no agregará la nueva columna "A_xtile". Simplemente devuelve mi marco de datos sin cambios. Si agrego primero una columna llena de valores ficticios, como NaN, llamada "A_xtile", entonces sobrescribe satisfactoriamente esta columna para incluir las marcas correctas del quintil.

Pero es extremadamente inconveniente tener que escribir primero en la columna para algo como esto que pueda querer agregar sobre la marcha.

Tenga en cuenta que una apply simple no funcionará aquí, ya que no sabrá cómo dar sentido a las matrices de resultados de diferentes tamaños para cada grupo.


¿Con qué problemas te encuentras? Funciona para este ejemplo de juguete aquí y las longitudes de grupo son diferentes:

In [82]: df Out[82]: X Y 0 0 -0.631214 1 0 0.783142 2 0 0.526045 3 1 -1.750058 4 1 1.163868 5 1 1.625538 6 1 0.076105 7 2 0.183492 8 2 0.541400 9 2 -0.672809 In [83]: def func(x): ....: x[''NewCol''] = np.nan ....: return x ....: In [84]: df.groupby(''X'').apply(func) Out[84]: X Y NewCol 0 0 -0.631214 NaN 1 0 0.783142 NaN 2 0 0.526045 NaN 3 1 -1.750058 NaN 4 1 1.163868 NaN 5 1 1.625538 NaN 6 1 0.076105 NaN 7 2 0.183492 NaN 8 2 0.541400 NaN 9 2 -0.672809 NaN