2017-06-24 3 views
2

Ich habe eine daraframe ähnlichepandas Zeilenwerte zu Spaltenüberschriften

df = pd.DataFrame({'id1':[1,1,1,1,2,2,2],'id2':[1,1,1,1,2,2,2],'value':['a','b','c','d','a','b','c']}) 

    id1 id2 value 
0 1 1  a 
1 1 1  b 
2 1 1  c 
3 1 1  d 
4 2 2  a 
5 2 2  b 
6 2 2  c 

Ich muss in dieser Form zu transformieren

id1 id2 a b c d 
0 1 1 1 1 1 1 
1 2 2 1 1 1 0 

Es kann für jede ID im Wertvariablen eine beliebige Anzahl von Ebenen sein, Bereich von 1 bis 10. Wenn die Ebene nicht für diese ID vorhanden ist, sollte es 0 sein.

Ich verwende Anaconda Python 3.5, Windows 10

+1

Wenn '2 1 1 c 'auf' geändert 2 1 1 a' was wird ausgegeben? – jezrael

+0

Sorry für Verwirrung. Ich werde nur eine Instanz von jedem Wert haben. bedeutet, für jede ID wird es nur ein "a" geben. Ich muss nur das Vorhandensein mit binären Werten überprüfen. Id1 und ID2 werden genau gleich sein. –

+1

Ok, also die ersten 2 Lösungen sind für dich. – jezrael

Antwort

4

Wenn benötigen Ausgang 1 und 0 nur auf das Vorhandensein von value:

Sie get_dummies mit Series von set_index erstellt verwenden können, aber dann notwendig ist, groupby + GroupBy.max:

df = pd.get_dummies(df.set_index(['id1','id2'])['value']) 
     .groupby(level=[0,1]) 
     .max() 
     .reset_index() 
print (df) 
    id1 id2 a b c d 
0 1 1 1 1 1 1 
1 2 2 1 1 1 0 

Eine andere Lösung mit groupby, size und unstack, aber dann ist erforderlich mit gt vergleichen und zu int von astype konvertieren. Letzte reset_index und rename_axis:

df = df.groupby(['id1','id2', 'value']) 
     .size() 
     .unstack(fill_value=0) 
     .gt(0) 
     .astype(int) 
     .reset_index() 
     .rename_axis(None, axis=1) 
print (df) 
    id1 id2 a b c d 
0 1 1 1 1 1 1 
1 2 2 1 1 1 0 

Wenn Bedarf zählen value s:

df = pd.DataFrame({'id1':[1,1,1,1,2,2,2], 
        'id2':[1,1,1,1,2,2,2], 
        'value':['a','b','a','d','a','b','c']}) 

print (df) 
    id1 id2 value 
0 1 1  a 
1 1 1  b 
2 1 1  a 
3 1 1  d 
4 2 2  a 
5 2 2  b 
6 2 2  c 

df = df.groupby(['id1','id2', 'value']) 
     .size() 
     .unstack(fill_value=0) 
     .reset_index() 
     .rename_axis(None, axis=1) 
print (df) 
    id1 id2 a b c d 
0 1 1 2 1 0 1 
1 2 2 1 1 1 0 

Oder:

df = df.pivot_table(index=['id1','id2'], columns='value', aggfunc='size', fill_value=0) 
     .reset_index() 
     .rename_axis(None, axis=1) 
print (df) 
    id1 id2 a b c d 
0 1 1 2 1 0 1 
1 2 2 1 1 1 0 
Verwandte Themen