2017-03-28 5 views
3

Ich möchte in meiner df eine neue Spalte erstellen. Die Werte dieser Spalte werden Werten aus mehreren anderen Spalten zugeordnet.Erstellen von Spalten-, Zeilenwertzuordnungen für mehrere Spalten

Zur Zeit habe ich dies:

df['PLATFORM'] = df['ID_1'].map(lambda x: 'ID_1_MATCH' if x == 9 else 0) 
df['PLATFORM'] = df['ID_2'].map(lambda x: 'ID_2_MATCH' if x == 10 else 0) 
df['PLATFORM'] = df['ID_3'].map(lambda x: 'ID_3_MATCH' if x == 11 else 0) 

Mit diesem Ansatz wird der Wert in der neuen Spalte auf der zweiten und dritten Karte überschrieben werden (wo x die Kriterien des Lambda-Ausdruck übereinstimmt). Ich möchte nur die Spalte aktualisieren, in der nach der vorherigen Karte ein Wert von 0 verbleibt.

Gibt es eine Möglichkeit, Werte in einer neuen Spalte abhängig von den Zeilenwerten in mehreren anderen Spalten hierarchisch abzubilden?

Antwort

3

Ich glaube, Sie brauchen numpy.where:

df['PLATFORM'] = np.where(df['ID_1'] == 9, 'ID_1_MATCH', 
       np.where(df['ID_2'] == 10, 'ID_2_MATCH', 
       np.where(df['ID_3'] == 11, 'ID_3_MATCH', 0))) 

Probe:

df = pd.DataFrame({'ID_1':[9,2,3,4], 
        'ID_2':[4,10,6,1], 
        'ID_3':[7,8,11,0]}) 

print (df) 
    ID_1 ID_2 ID_3 
0  9  4  7 
1  2 10  8 
2  3  6 11 
3  4  1  0 

df['PLATFORM'] = np.where(df['ID_1'] == 9, 'ID_1_MATCH', 
       np.where(df['ID_2'] == 10, 'ID_2_MATCH', 
       np.where(df['ID_3'] == 11, 'ID_3_MATCH', 0))) 
print (df) 
    ID_1 ID_2 ID_3 PLATFORM 
0  9  4  7 ID_1_MATCH 
1  2 10  8 ID_2_MATCH 
2  3  6 11 ID_3_MATCH 
3  4  1  0   0 
+0

Das funktioniert super - danke! Gibt es ein empfohlenes Limit für die Anzahl der Verschachtelung von 'np.where'? In diesem Fall muss ich bis zu 10 Mal nisten. –

+0

Ich denke, es gibt keine Grenze. Nur kann es in großen df ein bisschen langsamer sein. – jezrael

+0

Perfekt, danke! –

1

eine Bitmaske Verwenden Sie nur die Zeilen zu setzen, wo Ihre Bedingung wahr ist.

Dies ist idiomatischer (und schneller) als alle Karten oder Lambdas.

>>> df = pandas.DataFrame(columns=['x', 'y'], data=[[0,1], [1,2]]) 
>>> df 
    x y 
0 0 1 
1 1 2 
>>> df.ix[df['x'] % 2 == 0, 'match'] = 'x is even' 
>>> df.ix[df['y'] % 2 == 0, 'match'] = 'y is even' 
>>> df 
    x y  match 
0 0 1 x is even 
1 1 2 y is even 
>>> 
+1

Dies scheint ein guter Ansatz zu sein, außer dass zuvor zugewiesene Werte der Spalte überschrieben werden. Ich werde auf jeden Fall versuchen, dies zu nutzen, wenn ich weiß, dass sich die Bedingungen nicht überschneiden. Vielen Dank! –

Verwandte Themen