2016-05-26 3 views
0

Ich habe einen Datenrahmen, der wie dieser aussieht:erstellen, die auf ihrem Wert binäre Spalten in einem Datenrahmen von Zustand

df = pd.DataFrame(np.nan, index=[0,1,2,3], columns=['A','B','C']) 
df.iloc[0,0] = 'a' 
df.iloc[1,0] = 'b' 
df.iloc[1,1] = 'c' 
df.iloc[2,0] = 'b' 
df.iloc[3,0] = 'c' 
df.iloc[3,1] = 'b' 
df.iloc[3,2] = 'd' 
df 

out : A B C 
    0 a NaN NaN 
    1 b c NaN 
    2 b NaN NaN 
    3 c b d 

Und ich mag die Namen, um es neue Spalten hinzuzufügen sind die Werte innerhalb des Datenrahmens (hier 'a', 'b', 'c' und 'd'). Diese Spalten sind binär und geben an, ob die Werte 'a', 'b', 'c' und 'd' in der Zeile stehen.

In einem Bild, der Ausgang Ich mag würde, ist:

 A B C a b c d 
    0 a NaN NaN 1 0 0 0 
    1 b c NaN 0 1 1 0 
    2 b NaN NaN 0 1 0 0 
    3 c b d 0 1 1 1 

Um dies zu tun, ich erstellen Sie zuerst die mit Nullen gefüllt Spalten:

cols = pd.Series(df.values.ravel()).value_counts().index 
for col in cols: 
    df[col] = 0 

(Es schafft nicht die Spalten in der richtigen Reihenfolge, aber das spielt keine Rolle)

Dann ... ich habe eine Schleife über die Zeilen und Spalten verwendet ...

for row in df.index: 
    for col in cols: 
     if col in df.loc[row].values: 
      df.ix[row,col] = 1 

Sie erhalten, warum ich nach einer anderen Möglichkeit suche, es zu tun, auch wenn mein Datenrahmen relativ klein ist (76k Zeilen), dauert es immer noch etwa 8 Minuten, was viel zu lang ist.

Irgendeine Idee?

+0

Sie suchen 'get_dummies'. – IanS

Antwort

3

Sie suchen nach get_dummies. Hier wähle ich die .strversion verwenden:

df.fillna('', inplace=True) 
(df.A + '|' + df.B + '|' + df.C).str.get_dummies() 

Ausgang:

a b c d 
0 1 0 0 0 
1 0 1 1 0 
2 0 1 0 0 
3 0 1 1 1 
+2

nette Lösung! – MaxU

+0

Genau das habe ich gebraucht, vielen Dank! – ysearka

Verwandte Themen