2016-08-03 5 views
0

Ich habe diesen Datenrahmen:Erstellen neuer Spalten zum Speichern der Daten der doppelten ID-Spalte?

ID key 
0 1 A 
1 1 B 
2 2 C 
3 3 D 
4 3 E 
5 3 E 

ich zusätzliche key Spalten erstellen möge -wie notwendig- die Daten in der key Spalte zu speichern, wenn es doppelte ist IDs

Dies ist ein Ausschnitt aus der Ausgabe ist:

ID key key2 
0 1 A  B # Note: ID#1 appeared twice in the dataframe, so the key value "B" 
       # associated with the duplicate ID will be stored in the new column "key2" 

die komplette Ausgabe wie folgt sollte:

ID key key2 key3 
0 1 A  B NaN 
1 2 C NaN NaN 
2 3 D  E  E # The ID#3 has repeated three times. The key of      
         # of the second repeat "E" will be stored under the "key2" column 
         # and the third repeat "E" will be stored in the new column "key3" 

Jeder Vorschlag oder Idee, wie soll ich dieses Problem angehen?

Danke,

Antwort

1

prüfen groupby und apply aus. Ihre jeweiligen Dokumente sind here und here. Sie können unstack (docs) die zusätzliche Ebene des MultiIndex erstellen.

df.groupby('ID')['key'].apply(
    lambda s: pd.Series(s.values, index=['key_%s' % i for i in range(s.shape[0])]) 
).unstack(-1) 

Ausgänge

key_0 key_1 key_2 
ID     
1  A  B None 
2  C None None 
3  D  E  E 

Wenn Sie ID als Spalte möchten, können Sie reset_index auf diesem Datenrahmen nennen.

+0

Das ist erstaunlich! Wäre es möglich, dass der Code denselben Datenrahmen behandelt, aber mit der zusätzlichen Spalte "AlterKey", so wird der Datenrahmen insgesamt drei Spalten haben ('ID',' key' und 'AlterKey'). Wie sollte ich den Code ändern, damit er funktioniert? @Alex – MEhsan

+0

Ich meine Wie kann ich die "Lambda" -Funktion auf die neue Spalte "AlterKey" anwenden? Danke, @Alex – MEhsan

1

Sie können cumcount mit pivot_table verwenden:

df['cols'] = 'key' + df.groupby('ID').cumcount().astype(str) 
print (df.pivot_table(index='ID', columns='cols', values='key', aggfunc=''.join)) 
cols key0 key1 key2 
ID     
1  A  B None 
2  C None None 
3  D  E  E 
Verwandte Themen