2017-10-13 2 views
2

In Pandas für Datenanalyse ist ich auf ein Beispiel kam, wo wir eine Tabelle mit den folgenden Spalten:pivot_table mit einem Index, der nicht eine Spalte der Tabelle

name(string) sex(string) year(int) birth(int) 

Der Autor will auf aggregieren Jahr, Geschlecht und letzten Buchstaben der Namen, damit er tut:

# extract last letter from name column 
get_last_letter = lambda x: x[-1] 
last_letters = names.name.map(get_last_letter) 

last_letters.name = 'last_letter' 
table = names.pivot_table(values='births', index=last_letters, 
columns=['sex', 'year'], aggfunc=np.sum) 

ich verstehe nicht ganz, wie dies pivot_table erstellt wird, wenn last_letters nicht eine Spalte in der Tabelle ist. Kann jemand etwas Licht darauf werfen, wie Pandas names zu diesen last_letters richtig zuordnen konnte, wenn es aggregierte?

Antwort

3

Spalten in DataFrame sind Series, so mögliche Verwendung Series als Parameter in pivot_table ist.

So ist möglich, verwenden Sie die Vorverarbeitung Spalte name mit benutzerdefinierten Funktion für die Rückkehr nur letzten Buchstaben, weil es Series zurückgeben, was ist die perfekte gültige Eingabe.

Probe:

names = pd.DataFrame({ 
    'name': ['John','John','John','Josh','Josh','Josh','Sara','Sara','Sara'], 
    'births': [10,20,10,40,70,10,20,30,50], 
    'year': [1980,1985,1980,1985,1985,1985,1985,1980,1980], 
    'sex': ['m','m','m','m','m','m','f','f','f'] 
}) 
print (names) 
    births name sex year 
0  10 John m 1980 
1  20 John m 1985 
2  10 John m 1980 
3  40 Josh m 1985 
4  70 Josh m 1985 
5  10 Josh m 1985 
6  20 Sara f 1985 
7  30 Sara f 1980 
8  50 Sara f 1980 

# extract last letter from name column 
get_last_letter = lambda x: x[-1] 
last_letters = names.name.map(get_last_letter) 
last_letters.name = 'last_letter' 

print (last_letters) 
0 n 
1 n 
2 n 
3 h 
4 h 
5 h 
6 a 
7 a 
8 a 
Name: last_letter, dtype: object 

print (type(last_letters)) 
<class 'pandas.core.series.Series'> 

table = names.pivot_table(values='births', index=last_letters, 
          columns=['sex', 'year'], aggfunc=np.sum) 

print (table) 
sex    f   m  
year   1980 1985 1980 1985 
last_letter       
a   80.0 20.0 NaN NaN 
h    NaN NaN NaN 120.0 
n    NaN NaN 20.0 20.0 
+0

Sicher, aber wie funktioniert Pandas wissen, dass es mit dem Index aggregiert und Associate sollte 'a' nur die' Sie Angaben zu, dass in 'a' enden? –

+0

weil 'last_letters' Serie ist, bitte geben Sie mir etwas Zeit, ich erstelle Beispiel. – jezrael

+0

Danke für die Probe! Nur um zu verdeutlichen, wenn ich versuchte, die gleichen Informationen wie in 'last_letters' zu übergeben, aber innerhalb einer' list' anstatt einer 'Series' würde es abstürzen, korrigieren? Bedeutet das also, dass "Series" Informationen speichert, die sagen: "Ich wurde aus einer Spalte in der Tabelle erstellt", also weiß die Tabelle, was zu tun ist, wenn Sie sie als Index verwenden? –

Verwandte Themen