2013-08-27 3 views
5

Lassen Sie uns meine Datenrahmen sagen diese Daten enthält:wie eine neue Spalte auf den Werten anderer Spalten in Pandas Basis berechnen - Python

>>> df = pd.DataFrame({'a':['l1','l2','l1','l2','l1','l2'], 
         'b':['1','2','2','1','2','2']}) 
>>> df 
    a  b 
0 l1  1 
1 l2  2 
2 l1  2 
3 l2  1 
4 l1  2 
5 l2  2 

l1 entsprechen sollten 1 während l2 zu 2 entsprechen. Ich möchte eine neue Spalte 'c' so erstellen, dass für jede Zeile c = 1 wenn a = l1 und b = 1 (oder a = l2 und b = 2). Wenn a = l1 und b = 2 (oder a = l2 und b = 1) dann c = 0.

Der resultierende Datenrahmen sollte wie folgt aussehen:

a   b c 
0 l1  1 1 
1 l2  2 1 
2 l1  2 0 
3 l2  1 0 
4 l1  2 0 
5 l2  2 1 

Mein Datenrahmen ist sehr groß, so bin ich wirklich für den effizienteste Weg, um diese Pandas mit zu tun.

Antwort

8
df = pd.DataFrame({'a': numpy.random.choice(['l1', 'l2'], 1000000), 
        'b': numpy.random.choice(['1', '2'], 1000000)}) 

Eine schnelle Lösung, die nur zwei verschiedene Werte annimmt:

%timeit df['c'] = ((df.a == 'l1') == (df.b == '1')).astype(int) 

10 Schleifen, am besten von 3: 178 ms pro Schleife

@Viktor Kerkes:

%timeit df['c'] = (df.a.str[-1] == df.b).astype(int) 

1 Schlaufen, am besten von 3: 412 ms pro Schleife

@ user1470788:

%timeit df['c'] = (((df['a'] == 'l1')&(df['b']=='1'))|((df['a'] == 'l2')&(df['b']=='2'))).astype(int) 

1 Schlaufen, am besten von 3: 363 ms pro Schleife

@herrfz

%timeit df['c'] = (df.a.apply(lambda x: x[1:])==df.b).astype(int) 

1 Schleifen, Best of 3: 387 ms pro Schleife

+1

Interessant, aber es ist Ihre Lösung wesentlich weniger allgemein. Interessant ist, wie schlecht 'str [1]' Methoden im Vergleich zu einem einfachen Lambda sind. –

+0

Sie haben nicht nach '(df.a ==' l2 ') == (df.b ==' 2 ')' gesucht. –

+0

@StevenRumbalski Ich nehme an, die Beispieleingabe ist abgeschlossen, und 'a' hat nur Werte' l1' oder 'l2' und' b' nur ''1'' oder' '2''. Wenn "a! = 'L1'", muss es "l2" sein. – chlunde

2

df['c'] = (df.a.apply(lambda x: x[1:])==df.b).astype(int)

6

Sie können auch die String-Methoden verwenden.

df['c'] = (df.a.str[-1] == df.b).astype(int) 
0

Sie können nur logische Operatoren verwenden. Ich bin mir nicht sicher, warum Sie Strings von 1 und 2 anstelle von Ints verwenden, aber hier ist eine Lösung. Der astype am Ende konvertiert ihn von boolesch in Nullen und Einsen.

df['c'] = (((df['a'] == 'l1')&(df['b']=='1'))|((df['a'] == 'l2')&(df['b']=='2'))).astype(int)

Verwandte Themen