2017-03-21 4 views
0

Im folgenden Beispiel. Ich versuche, eine Spalte 'E' zu generieren, die entweder [1 oder 2] abhängig von einer bedingten Anweisung in Spalte A zugewiesen wird.Wert der neuen Spalte ['E'] basierend auf dem Wert der Spalte ['A'] über Datenrahmen zuweisen

Ich habe verschiedene Optionen ausprobiert, aber sie werfen einen Slicing-Fehler. (Sollte es nicht so etwas wie dies Wert auf neue Spalte 'E'?

df2 = df.loc zuweisen [df [ 'A'] == 'foo'] [ 'E'] = 1

import pandas as pd 
import numpy as np 
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(), 
        'B': 'one one two three two two one three'.split(), 
        'C': np.arange(8), 'D': np.arange(8) * 2}) 
print(df) 
#  A  B C D 
# 0 foo one 0 0 
# 1 bar one 1 2 
# 2 foo two 2 4 
# 3 bar three 3 6 
# 4 foo two 4 8 
# 5 bar two 5 10 
# 6 foo one 6 12 
# 7 foo three 7 14 

print('Filter the content') 
df2= df.loc[df['A'] == 'foo'] 
print(df2) 

#  A  B C D E 
# 0 foo one 0 0 1 
# 2 foo two 2 4 1 
# 4 foo two 4 8 1 
# 6 foo one 6 12 1 
# 7 foo three 7 14 1 

df3= df.loc[df['A'] == 'bar'] 
print(df3) 

#  A  B C D E 
# 1 bar one 1 2 2 
# 3 bar three 3 6 2 
# 5 bar two 5 10 2 

#Combile df2 and df3 back to df and print df 
print(df) 
#  A  B C D E 
# 0 foo one 0 0 1 
# 1 bar one 1 2 2 
# 2 foo two 2 4 1 
# 3 bar three 3 6 2 
# 4 foo two 4 8 1 
# 5 bar two 5 10 2 
# 6 foo one 6 12 1 
# 7 foo three 7 14 1 

Antwort

3

Wie sieht es einfach aus?

df['E'] = np.where(df['A'] == 'foo', 1, 2) 
1

Das tut, was ich denke, Sie versuchen, eine Spalte E in Ihrem Datenrahmen zu tun erstellen, die 1, wenn A == foo ist, und 2, wenn A = foo

df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(), 
        'B': 'one one two three two two one three'.split(), 
        'C': np.arange(8), 'D': np.arange(8) * 2}) 
df['E']=np.ones([df.shape[0],])*2 
df.loc[df.A=='foo','E']=1 
df.E=df.E.astype(int) 
print(df) 

Hinweis.!.: Ihre vorgeschlagene Lösung df2= df.loc[df['A'] == 'foo']['E'] = 1 verwendet serielles Slicing, anstatt loc. Zu nutzen. Um df-Zeilen nach der ersten Bedingung zu zerlegen und die Spalte E zurückzugeben, sollten Sie stattdessenverwenden

Hinweis II: Wenn Sie mehr als eine Bedingung haben, können Sie auch .replace() verwenden und ein Wörterbuch übergeben. In diesem Fall mappen Sie foo auf 1, bar auf 2 und so weiter.

0

Kürze halber (Zeichen)

df.assign(E=df.A.ne('foo')+1) 

    A  B C D E 
0 foo one 0 0 1 
1 bar one 1 2 2 
2 foo two 2 4 1 
3 bar three 3 6 2 
4 foo two 4 8 1 
5 bar two 5 10 2 
6 foo one 6 12 1 
7 foo three 7 14 1 

Kürze halber (Zeit)

df.assign(E=(df.A.values != 'foo') + 1) 

    A  B C D E 
0 foo one 0 0 1 
1 bar one 1 2 2 
2 foo two 2 4 1 
3 bar three 3 6 2 
4 foo two 4 8 1 
5 bar two 5 10 2 
6 foo one 6 12 1 
7 foo three 7 14 1 
Verwandte Themen