2017-09-19 4 views
3

Imaginez mes données d'entrée:Pandas dataframe - multi-index pour les lignes et les colonnes?

data = [("France", "Paris",  "Male", "1"), 
      ("France", "Paris",  "Female", "6"), 
      ("France", "Nice",  "Male", "2"), 
      ("France", "Nice",  "Female", "7"), 
      ("Germany", "Berlin",  "Male", "3"), 
      ("Germany", "Berlin",  "Female", "8"), 
      ("Germany", "Munchen", "Male", "4"), 
      ("Germany", "Munchen", "Female", "9"), 
      ("Germany", "Koln",  "Male", "5"), 
      ("Germany", "Koln",  "Female", "10")] 

Je voudrais le mettre dans une trame de données comme ceci:

Country City  Sex 
        Male  Female 
France Paris  1   6 
     Nice  2   7 
Germany Berlin  3   8 
     Munchen  4   9 
     Koln  5   10 

La première partie est facile:

df = pd.DataFrame(data, columns=["country", "city", "sex", "count"]) 
df = df.set_index(["country", "city"]) 

Donne me sortie:

    sex count 
country city     
France Paris  Male  1 
     Paris Female  6 
     Nice  Male  2 
     Nice  Female  7 
Germany Berlin  Male  3 
     Berlin Female  8 
     Munchen Male  4 
     Munchen Female  9 
     Koln  Male  5 
     Koln  Female 10 

Donc les lignes sont ok, mais maintenant je voudrais mettre les valeurs de la colonne 'sex' dans une colonne multi-index. Est-il possible de le faire, si oui, comment?

Répondre

2

Ajouter une colonne Sex-list dans set_index et appelez unstack:

df = df.set_index(["country", "city",'sex']).unstack() 
#data cleaning - remove columns name sex and rename column count 
df = df.rename_axis((None, None),axis=1).rename(columns={'count':'Sex'}) 
print (df) 
        Sex  
       Female Male 
country city    
France Nice   7 2 
     Paris  6 1 
Germany Berlin  8 3 
     Koln  10 5 
     Munchen  9 4 
0

Une autre méthode utilisant INPLACE pivot de Défaire (deux à peu près la même signification) i.e.

df.set_index(['country','city']).pivot(columns='sex') 
    
        count  
sex    Female Male 
country city    
France Nice   7 2 
     Paris  6 1 
Germany Berlin  8 3 
     Koln  10 5 
     Munchen  9 4