2016-12-02 8 views
1

Ich lerne Pandas und ich möchte eine neue Spalte zu meinen Daten erstellen (ich verwende die nationalen Namen Daten).neue Spalte hinzufügen und Verhältnis berechnen

Ich benutze nur 1880 und 1881 Jahre.

  name sex births year 
0  Mary F 7065 1880 
1  Anna F 2604 1880 
2  Emma F 2003 1880 
3 Elizabeth F 1939 1880 
4  Worthy M  5 1880 
5  Wright M  5 1880 
6  York M  5 1880 
7 Zachariah M  5 1880 
8  Mary F 6919 1881 
9  Anna F 2698 1881 
10  Emma F 2034 1881 
11 Elizabeth F 1852 1881 
12  Wilton M  5 1881 
13  Wing M  5 1881 
14  Wood M  5 1881 
15  Wright M  5 1881 

Ich bin die Geburten insgesamt Daten zu erstellen:

total_births = names.pivot_table('births', index='year', columns='sex', aggfunc=sum) 

die gibt:

sex  F M 
year   
1880 13611 20 
1881 13503 20 

Jetzt mag ich eine weitere Spalte in den Daten schaffen, wo ich das Verhältnis gesetzt werde von Geburten pro Jahr zu den Geburten pro Jahr.

Zum Beispiel:

name sex births  year ratio 
Mary F 7065  1880 7065/13611 
Wilton M  5  1881 5/13503 

Ich versuche:

new = (names.groupby(['year', 'sex'])).assign(ratio= (names.groupby(['year','sex'])).names['births']/total_births) 

die gibt:

AttributeError: Cannot access callable attribute 'assign' of 'DataFrameGroupBy' objects, try using the 'apply' method 

ODER

Ich habe versucht, zu brechen:

ratio = names.groupby(['year','sex']) 
ratio1 = ratio.loc[:,'births'] 

aber es gibt:

AttributeError: Cannot access callable attribute 'loc' of 'DataFrameGroupBy' objects, try using the 'apply' method 
+0

Können Sie eine kleine Datenprobe und die gewünschte Ausgabe hinzufügen? – jezrael

+0

Vielleicht helfen sehr gute Antworten - [Wie man gute reproduzierbare Pandas Beispiele macht] (http://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples) – jezrael

+0

@jezrael: Hallo, ich bearbeitet, danke – George

Antwort

3

Ich glaube, Sie groupby mit transformsum brauchen, und dann teilen, indem er div:

rat = names.groupby(['year','sex'])['births'].transform('sum') 
print (rat) 
0  13611 
1  13611 
2  13611 
3  13611 
4  20 
5  20 
6  20 
7  20 
8  13503 
9  13503 
10 13503 
11 13503 
12  20 
13  20 
14  20 
15  20 
Name: births, dtype: int64 
names['ratio'] = names.births.div(rat) 
print (names) 
     name sex births year  ratio 
0  Mary F 7065 1880 0.519065 
1  Anna F 2604 1880 0.191316 
2  Emma F 2003 1880 0.147160 
3 Elizabeth F 1939 1880 0.142458 
4  Worthy M  5 1880 0.250000 
5  Wright M  5 1880 0.250000 
6  York M  5 1880 0.250000 
7 Zachariah M  5 1880 0.250000 
8  Mary F 6919 1881 0.512405 
9  Anna F 2698 1881 0.199807 
10  Emma F 2034 1881 0.150633 
11 Elizabeth F 1852 1881 0.137155 
12  Wilton M  5 1881 0.250000 
13  Wing M  5 1881 0.250000 
14  Wood M  5 1881 0.250000 
15  Wright M  5 1881 0.250000 

Lösung mit assign:

names = names.assign(ratio=lambda x: x.births.div(rat)) 
print (names) 
     name sex births year  ratio 
0  Mary F 7065 1880 0.519065 
1  Anna F 2604 1880 0.191316 
2  Emma F 2003 1880 0.147160 
3 Elizabeth F 1939 1880 0.142458 
4  Worthy M  5 1880 0.250000 
5  Wright M  5 1880 0.250000 
6  York M  5 1880 0.250000 
7 Zachariah M  5 1880 0.250000 
8  Mary F 6919 1881 0.512405 
9  Anna F 2698 1881 0.199807 
10  Emma F 2034 1881 0.150633 
11 Elizabeth F 1852 1881 0.137155 
12  Wilton M  5 1881 0.250000 
13  Wing M  5 1881 0.250000 
14  Wood M  5 1881 0.250000 
15  Wright M  5 1881 0.250000 
+0

Ok, es funktioniert, danke! Wenn du auch eine Lösung mit assign anzeigen kannst, wird es hilfreich sein – George

+0

: Schön, danke! (upvoted) – George

Verwandte Themen