2017-12-14 5 views
4

ich mit Dubletten in einer Pandas df beschäftigen möchten:Python Pandas - Deal mit Dubletten

df=pd.DataFrame({'A':[1,1,1,2,1],'B':[2,2,1,2,1],'C':[2,2,1,1,1],'D':['a','c','a','c','c']}) 
df 

ich nur Zeilen mit eindeutigen Werten von A, B, C ein erstellen binären Spalten D_a und D_C behalten möchten, so die Ergebnisse werden in etwa so sein, ohne super langsam Schleifen zu tun in jeder Zeile ..

result= pd.DataFrame({'A':[1,1,2],'B':[2,1,2],'C':[2,1,1],'D_a':[1,1,0],'D_c':[1,1,1]}) 

vielen Dank

+0

Wie möchten Sie 'D_a' und' D_c' konstruieren, um von einer einzelnen Liste mit fünf Elementen zu zwei Listen mit drei Elementen zu gelangen? – vonludi

+0

Also, was ist die Regel für die Erstellung von D_a und D_c? Ich verstehe die Gründe dafür, Duplikate zu entfernen, aber was hoffst du mit D_a und D_c zu tun? Klingt, als könnte es einen besseren Weg geben, das Endziel zu erreichen. –

+0

Wenn eine unserer Antworten geholfen hat, stimmen Sie bitte ab und akzeptieren Sie sie. Vielen Dank! –

Antwort

2

Mit get_dummies + sum -

df = df.set_index(['A', 'B', 'C'])\ 
     .D.str.get_dummies()\ 
     .sum(level=[0, 1, 2])\ 
     .add_prefix('D_')\ 
     .reset_index() 

df 

    A B C D_a D_c 
0 1 1 1 1 1 
1 1 2 2 1 1 
2 2 2 1 0 1 
+0

@RoadRunner Ah gut! Es passiert. Wähler sind unbeständige Bestien. Am besten, es nicht unter die Haut gehen zu lassen. Genießen Sie einfach Ihre Zeit hier, teilen Sie Ihr Wissen und lernen Sie von anderen. Prost :-) –

+0

Ja, ich stimme zu. Immer beeindruckt von Ihren Antworten btw.Top Kerbe Python muss ich sagen. – RoadRunner

+0

@RoadRunner Danke, das weiß ich zu schätzen. Ich habe noch einen langen Weg vor mir. Aber ich würde gerne denken, dass ich dahin komme. Die Sache ist, immer offen zu bleiben und für Feedback empfänglich zu sein. Es gibt mehr als nur die Reputation in Ihrem Profil. :-) –

3

Sie verwenden können:

df1 = (df.groupby(['A','B','C'])['D'] 
     .value_counts() 
     .unstack(fill_value=0) 
     .add_prefix('D_') 
     .clip_upper(1) 
     .reset_index() 
     .rename_axis(None, axis=1)) 

print (df1) 
    A B C D_a D_c 
0 1 1 1 1 1 
1 1 2 2 1 1 
2 2 2 1 0 1 
+0

Beeindruckend in der Tat. – RoadRunner

+0

Vielen Dank. – jezrael

+0

Ich füge hinzu, dass die wichtige Feinheit hier 'clip_upper' ist. Ohne diese werden Dubletten nicht entfernt. Dies ist klarer mit 'pd.DataFrame ({'A': [1,1,1,2,1,1], 'B': [2,2,1,2,1,1], 'C': [2,2,1,1,1,1], 'D': ['a', 'c', 'a', 'c', 'c', 'c']}) '(einfach zuletzt wiederholt) Reihe). Sehr schön! – josh

2

Sie können

df.loc[df['D']=='a', 'D_a'] = 1 
df.loc[df['D']=='c', 'D_c'] = 1 
wie diese etwas tun

Dieses eine 1 in einer neuen Spalte gesetzt wird, wo jeder ein "a" oder "c" erscheint .

A B C D D_a D_c 
0 1 2 2 a 1.0 NaN 
1 1 2 2 c NaN 1.0 
2 1 1 1 a 1.0 NaN 
3 2 2 1 c NaN 1.0 
4 1 1 1 c NaN 1.0 

aber dann müssen Sie die NaN mit nur 0.

df = df.fillna(0) 

Als nächstes ersetzen Sie die Spalten auswählen, die Sie brauchen, und dann die Duplikate löschen.

df = df[["A","B","C", "D_a", "D_c"]].drop_duplicates() 

Hoffe, das ist die Lösung, die Sie gesucht haben.