2 votes

Les pandas divisent la colonne des sexes en deux colonnes

J'ai le tableau suivant : https://ibb.co/DMGCgD2

Je veux diviser (Type de propriété) en deux colonnes : count_Single_Family et count_Multi_Family dans chaque code postal :

J'ai utilisé ce code mais je ne sais pas ce qu'il faut faire ensuite :

b=Combineddf[Combineddf['Property Type']=='Multi-Family'].count() a=Combineddf[Combineddf['Property Type']=='Single Family'].count()

Je peux le faire avec sql mais je continue à essayer de le faire fonctionner avec pandas mais sans succès. Merci pour votre aide. Edit* Entrée :

    import pandas as pd
input= pd.DataFrame({'Zip Code': [90001, 90001, 90001,90002,90002,90002], 
                   'Total Males': [28468, 28468, 28468,43533,43533,43533],
                  'Total Female': [32135, 32135, 32135,54354,54354,54354],
                   'Property Type': ['Multi-Family', 'Multi-Family', 'Single Family','Single Family','Single Family','Multi-Family']
                  })
input

Sortie souhaitée :

    out = pd.DataFrame({'Zip Code': [90001, 90001, 90001,90002,90002,90002], 
                       'Total Males': [28468, 28468, 28468,43533,43533,43533],
                      'Total Female': [32135, 32135, 32135,54354,54354,54354],
                       'Multi-Family': [2, 2, 2,1,1,1],
                       'Single Family': [1, 1, 1,2,2,2],

                      })
out

1voto

jpp Points 83462

pd.crosstab + merge

Pandas dispose d'une méthode pour effectuer des tableaux croisés basés sur un indice et des valeurs. Il vous suffit ensuite de fusionner ces résultats avec votre cadre de données d'origine.

df_cross = pd.crosstab(df['Zip Code'], df['Property Type'])

res = df.merge(df_cross, left_on='Zip Code', right_index=True)

print(res)

   Zip Code  Total Males  Total Female  Property Type  Multi-Family  \
0     90001        28468         32135   Multi-Family             2   
1     90001        28468         32135   Multi-Family             2   
2     90001        28468         32135  Single Family             2   
3     90002        43533         54354  Single Family             1   
4     90002        43533         54354  Single Family             1   
5     90002        43533         54354   Multi-Family             1   

   Single Family  
0              1  
1              1  
2              1  
3              2  
4              2  
5              2

0voto

Christian Sloper Points 3508

Cela semble donner la bonne solution :

v = input.groupby(['Zip Code','Property Type']).count().reset_index().pivot(index='Zip Code',columns = 'Property Type',values = 'Total Males')

pd.merge(input,v, how = 'inner', left_on = 'Zip Code', right_on ='Zip Code').drop('Property Type',axis = 1)

0voto

Peter Leimbigler Points 5340

Une autre solution :

(pd.concat([input.set_index('Zip Code'), 
            input.groupby('Zip Code')['Property Type']
                 .value_counts()
                 .unstack()], axis=1)
).reset_index()

   Zip Code  Total Males  Total Female  Property Type  Multi-Family  Single Family
0     90001        28468         32135   Multi-Family             2              1
1     90001        28468         32135   Multi-Family             2              1
2     90001        28468         32135  Single Family             2              1
3     90002        43533         54354  Single Family             1              2
4     90002        43533         54354  Single Family             1              2
5     90002        43533         54354   Multi-Family             1              2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X