2016-10-05 2 views
2

Ich habe einen Pandas-Datenrahmen, der 2 Spalten hat. Ich möchte die Zeilen durchlaufen und basierend auf einer Zeichenfolge aus Spalte 2 möchte ich eine Zeichenfolge in einer neu erstellten dritten Spalte hinzufügen. Ich habe versucht:Wie über Pandas Dataframe iterieren und neue Spalte erstellen

for i in df.index: 
    if df.ix[i]['Column2']==variable1: 
     df['Column3'] = variable2 
    elif df.ix[i]['Column2']==variable3: 
     df['Column3'] = variable4 

print(df) 

Aber der resultierende Datenrahmen hat in Spalte 3 nur Variable2.

Irgendwelche Ideen, wie sonst könnte ich das tun?

+0

Sie können 'für i, r in df.iterrows()' verwenden, um 'i' als Index und' r' als eine Reihe von Zeilenwerten zu erhalten. Dies macht das Schreiben der if, elif-Bedingungen einfacher 'if r.Column2 == variable1:' – josh

+0

Ich habe gerade festgestellt, dass das Hauptproblem hier ist, dass Sie die gesamte Spalte Column3 entweder auf variable2 und variable4 für ALL 'i' setzen. Sie erhalten nur Variable2, da Variable1 das letzte Element in Spalte2 ist. Mit anderen Worten benutzen Sie einfach 'df.ix [i, 'Column3'] = variable2' und' df.ix [i, 'Column3'] = variable4'. – josh

Antwort

2

Ich glaube, Sie doppelt numpy.where verwenden können, was schneller ist als Schleife:

df['Column3'] = np.where(df['Column2']==variable1, variable2, 
       np.where(df['Column2']==variable3, variable4)) 

Und wenn brauchen Variable hinzufügen, wenn beide Bedingungen False:

df['Column3'] = np.where(df['Column2']==variable1, variable2, 
       np.where(df['Column2']==variable3, variable4, variable5)) 

Probe:

df = pd.DataFrame({'Column2':[1,2,4,3]}) 
print (df) 
    Column2 
0  1 
1  2 
2  4 
3  3 

variable1 = 1 
variable2 = 2 
variable3 = 3 
variable4 = 4 
variable5 = 5 

df['Column3'] = np.where(df['Column2']==variable1, variable2, 
       np.where(df['Column2']==variable3, variable4, variable5)) 

print (df) 
    Column2 Column3 
0  1  2 
1  2  5 
2  4  5 
3  3  4 
Eine andere Lösung, danke Jon Clements:
df['Column4'] = df.Column2.map({variable1: variable2, variable3:variable4}).fillna(variable5) 
print (df) 
    Column2 Column3 Column4 
0  1  2  2.0 
1  2  5  5.0 
2  4  5  5.0 
3  3  4  4.0 
+0

Oder möglicherweise: 'df.Column2.map ({1: 'foo', 3: 'bar'}). Fillna ('')' - dann hast du deine Bedingungen (nicht verschachtelt in einem One-Op-Diktat) und die "fillna" als Standardwert –

+0

Ja, nur die Konvertierung in 'float' ist nicht nett, aber es funktioniert gut, wenn die Variablen' float' oder 'string' sind. Wenn 'int', ist nur' .astype (int) 'notwendig. Danke. – jezrael

+0

danke Jezrael es hat sehr gut funktioniert. Wenn ich nicht zu frech bin und das könnte sehr schwierig sein, aber wie kann ich nun Variable5 entweder mit Variable 2 oder 4 gleichberechtigt ersetzen unter Berücksichtigung, dass nicht beide Variablen aktuell die gleiche Anzahl an Zeilen haben. In Ihrem Beispiel wäre Spalte 4 –

1

Sie können auch versuchen, diese (wenn Sie die for Schleife behalten möchten Sie verwenden):

new_column = [] 

for i in df.index: 
    if df.ix[i]['Column2']==variable1: 
     new_column.append(variable2) 
    elif df.ix[i]['Column2']==variable3: 
     new_column.append(variable4) 
    else : #if both conditions not verified 
     new_column.append(other_variable) 

df['Column3'] = new_column 
0

Erstens gibt es keine Notwendigkeit, eine Schleife durch jede und jeden Index, nur Pandas verwenden gebaut in boolean indexing. Erste Zeile hier sammeln wir alle Werte in Column2, die gleich variable1 und stellen Sie die gleiche Zeile in Column3 sind variable2

df.ix[df.Column2==variable1, 'Column3'] = variable2 
df.ix[df.Column2==variable3, 'Column3'] = variable4 

Ein einfaches Beispiel wäre

import pandas as pd 

df = pd.DataFrame({'Animal':['dog', 'fish', 'fish', 'dog']}) 
print(df) 

    Animal 
0 dog 
1 fish 
2 fish 
3 dog 

df.ix[df.Animal=='dog', 'Colour'] = 'brown' 
df.ix[df.Animal=='fish', 'Colour'] = 'silver' 
print(df) 

    Animal Colour 
0 dog  brown 
1 fish silver 
2 fish silver 
3 dog  brown 

Das obige Verfahren

sein kann sehr einfach mit mehreren Bedingungen wie & und | auf booleschen Index aufgebaut werden.

df = pd.DataFrame({'Animal':['dog', 'fish', 'fish', 'dog'], 'Age': [1, 3, 2, 10]}) 
print(df) 

    Age Animal 
0 1 dog 
1 3 fish 
2 2 fish 
3 10 dog 

df.ix[(df.Animal=='dog') & (df.Age > 8), 'Colour'] = 'grey' # old dogs go grey 
df.ix[(df.Animal=='dog') & (df.Age <= 8), 'Colour'] = 'brown' 
df.ix[df.Animal=='fish', 'Colour'] = 'silver' 
print(df) 

    Age Animal Colour 
0 1 dog brown 
1 3 fish silver 
2 2 fish silver 
3 10 dog grey 
Verwandte Themen