Novato de los pandas, enfrentando un problema simple que no puedo resolver.

Tengo un conjunto de datos de nombres de bebés en los EE. UU. Que se ve así:

orig data

Estoy tratando de escribir un programa donde pueda alimentar una lista de nombres y recuperar el% de probabilidad de que el nombre sea para un hombre o una mujer (el año es irrelevante para mis propósitos en este momento)

Llegué a escribir el grupo y luego agregué los nombres masculino y femenino juntos.

groupby data

Ahora todo lo que necesito es calcular los porcentajes basados en estos datos. Creo que es una especie de transform (¿verdad?) Pero parece que no puedo escribir nada que funcione. Sé exactamente cómo lo haría en SQL, pero realmente estoy tratando de descubrir Pandas. ¡Algunas sugerencias serían muy apreciadas!

¡Gracias!

0
tarastar42 8 may. 2016 a las 05:08

3 respuestas

La mejor respuesta

Si entendiera correctamente lo que está buscando, primero llenaría los valores faltantes con ceros, es decir, n.fillna(0). Luego calcule los porcentajes y asigne los resultados a una nueva columna. Por porcentaje femenino:

n['%F'] = n[('Count', 'F')] / n['sum'] * 100
1
pbreach 8 may. 2016 a las 02:22

Parece Multiindex en columnas:

print n.columns
MultiIndex(levels=[[u'Count', u'sum'], [u'', u'F', u'M']],
           labels=[[0, 0, 1], [1, 2, 0]],
           names=[None, u'Gender'])

Entonces, primero seleccione las columnas F y M por using-slicers. Entonces fillna por {{ X3}} y dividir por columna sum:

idx = pd.IndexSlice
F = n.loc[:, idx['Count','F']] 
M = n.loc[:, idx['Count','M']] 
sum = n.loc[:, idx['sum','']]

n['%F'] = F.fillna(0)/sum * 100
n['%M'] = M.fillna(0)/sum * 100
print n

               Count                     sum          %F          %M
Gender             F           M                                    
Name                                                                
Aaban            NaN   10.285710   10.285710    0.000000  100.000000
Aabfla      7.000000         NaN    7.000000  100.000000    0.000000
Aabid            NaN    5.000000    5.000000    0.000000  100.000000
Aabrielle   5.000000         NaN    5.000000  100.000000    0.000000
Aadarn           NaN    8.521739    8.521739    0.000000  100.000000
Aadan            NaN   12.000000   12.000000    0.000000  100.000000
Aadar            NaN   11.285710   11.285710    0.000000  100.000000
Aaden       5.000000  279.002857  284.002857    1.760546   98.239454
Aade             NaN    5.000000    5.000000    0.000000  100.000000
Aadhav           NaN   12.750000   12.750000    0.000000  100.000000
Aadhavan         NaN    6.333333    6.333333    0.000000  100.000000
Aadhi            NaN    6.000000    6.000000    0.000000  100.000000
Aadhira     0.888857         NaN    9.000007    9.876181    0.000000
Aadhve     79.875000         NaN   79.875000  100.000000    0.000000
Aadhven          NaN    5.000000    5.000000    0.000000  100.000000
Aadi        5.333333   55.583333   60.910007    8.756087   91.254846
Aadian           NaN    5.000000    5.000000    0.000000  100.000000
Aadil            NaN   12.913003   12.913003    0.000000  100.000000
Aadin            NaN   12.000000   12.000000    0.000000  100.000000
0
jezrael 8 may. 2016 a las 07:07

Incluso antes de realizar la suma, harías esto:

n.apply(lambda x: x / x.sum(), axis=1)
0
piRSquared 8 may. 2016 a las 03:57