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 datosdf2
,(df2["X"].value_counts() / len(df2))
es una serie con ocurrencias relativas de los elementos de la columna"X"
.