2016-07-08 4 views
1

Ich habe eine Pandas Datenrahmen wie diese bekommen:pandas.DataFrame.loc, Etikettieren Daten in neue Spalte

 ranking 
1 4.33 
2 1.34 
3 3.76 
.. 

Und ich möchte diese erstellen:

 ranking label 
1 4.33  2 
2 1.34  0 
3 3.76  1 
.. 

So ein Ranking < 3.5 führt zu einem Label von 0 führt ein Ranking zwischen 3.5 und 4.25 zu einem Label von 1, und ein Ranking > 4.25 führt zu einem Label von 2.

Dies ist der Code, den ich bisher geschrieben:

df = pd.read_csv('./data/Step7_final.csv', index_col=False, encoding="ISO-8859-1") 
df['label'] = df.ranking.where(df.ranking > 3.4999, 0) 
df.loc[df.label > 3.4999 and < 4.2499, 'label'] = 1 
df.loc[df.label > 4.2499, 'label'] = 2 

Die dritte Zeile, wo ich das Etikett 1 auf der Rangwerte zwischen 3,5 zuweisen und 4,25 nicht funktioniert ... Wie kann ich diese Arbeit machen?

+0

Verwenden 'df.loc [(df.label> 3,4999) & (df.label <4,2499), 'label']' statt. – IanS

+0

Danke IanS! Das hat perfekt funktioniert – Papie

Antwort

4

Sie müssen bitweise & statt and verwenden. Die Bedingungen müssen nach parantheses gruppiert werden.

jedoch ein besserer Weg wäre pd.cut zu verwenden:

pd.cut(df['ranking'], [-np.inf, 3.5, 4.25, np.inf], labels=[0, 1, 2]) 
Out[55]: 
0 2 
1 0 
2 1 
Name: ranking, dtype: category 
Categories (3, int64): [0 < 1 < 2] 
+1

Danke ayhan! Können Sie mir sagen, warum und nicht funktioniert und & ist? Ich verstehe das nicht wirklich – Papie

+1

'und' versteht nicht, wie man ein Array richtig bewertet, weil es mehrdeutig ist, da Sie ein Array von booleschen Werten erwarten. Was ist, wenn nur einer wahr ist oder alle außer einem? Dies führt zu einem Fehler und verlangt, dass Sie 'any' oder' all' aufrufen müssen, damit ein skalarer Wert zurückgegeben wird. Wenn Sie Arrays von booleschen Werten vergleichen möchten, verwenden Sie die bitweisen Operatoren '&', '|' und ' ~ 'für' und ',' oder ', und' nicht' bzw. – EdChum

+0

@Papie Ihr Vergleich ist elementweise. Normalerweise prüft 'and' zwei Bedingungen und gibt True zurück, wenn beide True sind. Für pandas/numpy wenden Sie das gleiche auf zwei Serien an, sodass es für jedes Paar eine Reihe von booleschen Werten zurückgeben soll. Sie benutzen '&' (für und), '|' für oder und '~' für nicht. http://stackoverflow.com/a/13572798/2285236 – ayhan

1

Sie benötigen:

df['label'] = df.ranking.where(df.ranking > 3.4999, 0) 
df.ix[(df.label > 3.4999) & (df.label < 4.2499), 'label'] = 1 
df.ix[df.label > 4.2499, 'label'] = 2 
print (df) 
    ranking label 
1  4.33 2.0 
2  1.34 0.0 
3  3.76 1.0 
+0

Danke Jezrael! Das hat perfekt funktioniert :) – Papie

Verwandte Themen