Pandas, Aplicar función tiene como resultado el retorno equivocadas

Carlos Carvalho:

Tengo este problema con esta función, que debe devolver la proporción de cada función en una columna.

He aquí algunos datos mucho más fácil hacer una idea:

df2 = pd.DataFrame({'X': ['A', 'A', 'B' , 'C'], 'Y': [1, 0, 0 , 1], 'Z': [1, 0, 1 , 1]})

df2['X'].value_counts() 

Cuando cuente los valores de recibo

A    2
B    1
C    1

Ahora, tengo que conseguir la proporción para cada valor de "X"

for freq in df2['X'].value_counts():
    #print(freq)
    print(freq/df2['X'].value_counts().sum())

El resultado a continuación:

0.5
0.25
0.25

Perfecto,

Ahora debo aplicar a mi trama de datos y obtener una nueva columna. Por debajo de la función:

def get_proportion(df):
    for freq in df2['X'].value_counts():
        return (freq/df2['X'].value_counts().sum())

df2["A"]=df2.apply(get_proportion, axis=1)

resultado:

    X   Y   Z   A
0   A   1   1   0.5
1   A   0   0   0.5
2   B   0   1   0.5
3   C   1   1   0.5

Que debería obtener

    X   Y   Z   A
0   A   1   1   0.5
1   A   0   0   0.5
2   B   0   1   0.25
3   C   1   1   0.25

¿Qué pasa?

Si conjunto de retorno bajo el bucle me sale error muesca

def get_proportion(df):
    for freq in df['X'].value_counts():
    return freq/df['X'].value_counts().sum()

Error Tabulación: Se esperaba un bloque tabulado

Si fijo un argumento

df2["A"]=df2.apply(get_proportion(df2), axis=1)

Me aparece un error

TypeError: 'numpy.float64' object is not callable

Gracias si usted puede ayudar.

mariand:
df2["A"] = df2.X.apply(lambda x: (df2["X"].value_counts() / len(df2))[x])

  • len(df2)es el número de filas de la trama de datos df2,
  • (df2["X"].value_counts() / len(df2))es una serie con ocurrencias relativas de los elementos de la columna "X".

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=373245&siteId=1
Recomendado
Clasificación