2017-03-09 2 views
1

Ich habe Datenrahmen unterWie Dummies bekommen und GROUPBY

Q A 
A a h 
A b i 
A c j 
B d k 
B a l 
B b m 
C c n 

Ich möchte Dummy bekommen und

a b c d e f g 
A h i j nan nan nan nan 
B l nan nan nan k nan nan  
C nan nan n nan nan nan nan 

col=df.Q

I get_dummies und groupby muss gelten GROUPBY .but ich könnte nicht herausfinden.

Wie kann ich dieses Ergebnis erhalten?

Antwort

2

Es scheint, Sie brauchen reset_index mit pivot:

df = df.reset_index().pivot(index='index', columns='Q', values='A') 
print (df) 
Q   a  b  c  d 
index       
A   h  i  j None 
B   l  m None  k 
C  None None  n None 

Und dann, wenn nötig reindex_axis und replace:

cols = list('abcdefg') 
print (df.reindex_axis(cols, axis=1).replace({None:np.nan})) 
Q  a b c d e f g 
index         
A  h i j NaN NaN NaN NaN 
B  l m NaN k NaN NaN NaN 
C  NaN NaN n NaN NaN NaN NaN 

EDIT:

Wenn Duplikate in Daten besser groupby mit join ist:

print (df) 
    Q A 
A a h 
A b i 
A c j 
B d k 
B a l 
B b m <-duplicates B b 
B b t <-duplicates B b 
C c n 


df = df.reset_index().groupby(['index','Q'])['A'].apply(','.join).unstack() 
print (df) 
Q   a  b  c  d 
index       
A   h  i  j None 
B   l m,t None  k 
C  None None  n None 

Eine andere mögliche Lösung mit pivot_table:

#aggfunc='first' - get only first value, another values are lost 
df1 = df.reset_index().pivot_table(index='index', columns='Q', values='A', aggfunc='first') 
print (df1) 
Q   a  b  c  d 
index       
A   h  i  j None 
B   l  m None  k 
C  None None  n None 
Q   a  b  c  d 

#aggfunc='sum' - summed data, no separator 
df2 = df.reset_index().pivot_table(index='index', columns='Q', values='A', aggfunc='sum') 
print (df2) 
index       
A   h  i  j None 
B   l mt None  k 
C  None None  n None 
Q   a  b  c  d 

#aggfunc=','.join - summed data with separator 
df3 = df.reset_index().pivot_table(index='index', columns='Q', values='A', aggfunc=','.join) 
print (df3) 
index       
A   h  i  j None 
B   l m,t None  k 
C  None None  n None