2016-09-22 1 views
1

Ich habe einen Datenrahmen, die etwa wie folgt aussieht:Wie erstelle ich eine neue Spalte in Python Dataframe, indem ich auf zwei andere Spalten referenziere?

df = pd.DataFrame({'Name':['a','a','a','a','b','b','b'], 'Year':[1999,1999,1999,2000,1999,2000,2000], 'Name_id':[1,1,1,1,2,2,2]}) 

    Name Name_id Year 
0 a  1 1999 
1 a  1 1999 
2 a  1 1999 
3 a  1 2000 
4 b  2 1999 
5 b  2 2000 
6 b  2 2000 

Was ich möchte, muss eine neue Spalte ‚yr_name_id‘, das für jede einzelne Name_id Jahr Kombination erhöht und beginnt dann von neuem mit jedem neuen Name_id .

Name Name_id Year yr_name_id 
0 a  1 1999   1 
1 a  1 1999   1 
2 a  1 1999   1 
3 a  1 2000   2 
4 b  2 1999   1 
5 b  2 2000   2 
6 b  2 2000   2 

Ich habe eine Vielzahl von Dingen versucht, und sah here, here und an einigen Stellen auf groupby und aufzuzählen.

Zuerst habe ich versucht, ein einzigartiges Wörterbuch Erstellen nach Name_id und Jahr kombiniert und dann Karte unter Verwendung von Werten zuweisen, aber wenn ich versuche Name_id und Jahr als Strings zu kombinieren über:

df['yr_name_id'] = str(df['Name_id']) + str(df['Year']) 

Die neue Spalte eines nicht eindeutige Syntax von 0 0 1\n1 1\n2 1\n3 1\n4 2\n5 2..., die ich nicht wirklich verstehe.

Ein vielversprechender Ansatz, den ich denke, dass ich gerade mit dem Lambda helfen muß, ist durch groupby mit

df['yr_name_id'] = df.groupby(['Name_id', 'Year'])['Name_id'].transform(lambda x:)#unsure from this point 

Ich bin sehr vertraut mit Lambda ist so eine Anleitung, wie ich dies tun könnte wäre sehr dankbar.

Antwort

1

IIUC Sie können es auf diese Weise tun:

In [99]: df['yr_name_id'] = pd.Categorical(pd.factorize(df['Name_id'].astype(str) + '-' + df['Year'].astype(str))[0] + 1) 

In [100]: df 
Out[100]: 
    Name Name_id Year yr_name_id 
0 a  1 1999   1 
1 a  1 1999   1 
2 a  1 1999   1 
3 a  1 2000   2 
4 b  2 1999   3 
5 b  2 2000   4 
6 b  2 2000   4 

In [101]: df.dtypes 
Out[101]: 
Name   object 
Name_id   int64 
Year    int64 
yr_name_id category 
dtype: object 

Aber in der gewünschten DF suchen, es sieht aus wie Sie gerade eine Year Spalte kategorisieren wollen, nicht eine Kombination aus Name_id + Year

In [102]: df['yr_name_id'] = pd.Categorical(pd.factorize(df.Year)[0] + 1) 

In [103]: df 
Out[103]: 
    Name Name_id Year yr_name_id 
0 a  1 1999   1 
1 a  1 1999   1 
2 a  1 1999   1 
3 a  1 2000   2 
4 b  2 1999   1 
5 b  2 2000   2 
6 b  2 2000   2 

In [104]: df.dtypes 
Out[104]: 
Name   object 
Name_id   int64 
Year    int64 
yr_name_id category 
dtype: object 
0

Verwendung itertools.count:

from itertools import count 

counter = count(1) 
df['yr_name_id'] = (df.groupby(['Name_id', 'Year'])['Name_id'] 
         .transform(lambda x: next(counter))) 

Ausgabe:

Name Name_id Year yr_name_id 
0 a  1 1999   1 
1 a  1 1999   1 
2 a  1 1999   1 
3 a  1 2000   2 
4 b  2 1999   3 
5 b  2 2000   4 
6 b  2 2000   4 
Verwandte Themen