2016-09-22 22 views
5

Kategori değişkenine ve bazı sayı değişkenlerine sahip pandalar veri çerçevem ​​var. Böyle bir şey:Pandalar veri çerçevesi satırlarını, kategoriye göre sütunlara nasıl dönüştürür?

ls = [{'count':5, 'module':'payroll', 'id':2}, {'count': 53, 'module': 'general','id':2}, {'id': 5,'count': 35, 'module': 'tax'}, ] 
df = pd.DataFrame.from_dict(ls) 

df şuna benzer:

df 
Out[15]: 
    count id module 
0  5 2 payroll 
1  53 2 general 
2  35 5  tax 

ben dönüştürmek istiyorum (devrik doğru kelime?) sütunlar ve gruba modül değişkenleri kimliğe göre. Yani bir şey gibi: Ancak, bu çoklu dezavantajı da ortaya

df['payroll_count'] = df.id.apply(lambda x: df[df.id==x][df.module=='payroll']) 

:

  1. Pahalı ve çok fazla zaman alır

    Buna
    general_count id payroll_count tax_count 
    0   53.0 2   5.0  NaN 
    1   NaN 5   NaN  35.0 
    

    Bir yaklaşım uygulamak kullanmak olacaktır

  2. Artefakt oluşturma ve boşaltma veri çerçeveleri t şapka temizlenmelidir. Seziyorum

orada pandas groupby ile bunu başarmak için daha iyi bir yol, ama daha verimli bu aynı operasyonda için bir yol bulmak mümkün değil. Lütfen yardım et.

+0

unstack İlk satırda id id = 2 olmalı, değil mi? – IanS

+0

Yep. düzeltildi .. İşaretlediğiniz için teşekkürler .. Jezrael de güzel bir cevap verdi. –

cevap

5

groupby numaralı telefonu kullanarak yeni index ve son column numaralı sütunları oluşturabilirsiniz. o zaman aggreagate bir şekilde gerekir - mean kullanıyorum, daha sonra DataFrame (Series) sütununa DataFrame.squeeze (daha sonra Multiindex üst düzeyini sütunlarda kaldır) ve unstack yeniden şekillendirin. sütun adının add_suffix Son:

df = df.groupby(['id','module']).mean().squeeze().unstack().add_suffix('_count') 
print (df) 
module general_count payroll_count tax_count 
id            
2    53.0   5.0  NaN 
5     NaN   NaN  35.0 

pivot ile diğer çözüm, daha sonra list comprehension tarafından sütunlarından Multiindex kaldırmak gerekir: İstediğiniz çıktısında

df = df.pivot(index='id', columns='module') 
df.columns = ['_'.join((col[1], col[0])) for col in df.columns] 
print (df) 
    general_count payroll_count tax_count 
id           
2   53.0   5.0  NaN 
5    NaN   NaN  35.0 
+0

Teşekkürler .. groupby çözüm benim durumuma mükemmel uyuyor. Pivot, verileri kümelemeye çalışırken sorunlara neden olabilir. Bu groupby'nin diğerleri için nasıl yararlı olacağına dair bir açıklama. –

+0

Tamam, beni ec olarak ver – jezrael

0

Şunları kullanabilirsiniz set_index ve

In [2]: df.set_index(['id','module'])['count'].unstack().add_suffix('_count').reset_index() 
Out[2]: 
module id general_count payroll_count tax_count 
0  2   53.0   5.0  NaN 
1  5   NaN   NaN  35.0 
İlgili konular