2016-09-22 16 views
5

मेरे पास एक श्रेणी परिवर्तक और कुछ संख्या चर के साथ एक पांडा डेटा फ्रेम है। कुछ इस तरह: आईडी द्वाराश्रेणी के आधार पर पांडा डेटाफ्रेम पंक्तियों को कॉलम में कैसे परिवर्तित करें?

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

मैं परिवर्तित करना चाहते हैं (स्थानांतरित सही शब्द है?) कॉलम और समूह में मॉड्यूल चर:

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 इस तरह दिखता है। तो कुछ की तरह:

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

बहरहाल, यह कई कमियां से ग्रस्त:

  1. महंगे, और बहुत अधिक समय लगता है

    इस के लिए
    general_count id payroll_count tax_count 
    0   53.0 2   5.0  NaN 
    1   NaN 5   NaN  35.0 
    

    एक दृष्टिकोण को लागू करने का उपयोग किया जाएगा

  2. कलाकृतियों और खाली डेटाफ्रेम टी बनाता है टोपी साफ करने की जरूरत है।

मैं समझ pandas groupby साथ इस लक्ष्य को हासिल करने के लिए एक बेहतर तरीका नहीं है, लेकिन और अधिक कुशलता से यह एक ही आपरेशन के लिए एक रास्ता नहीं मिल रहा। कृपया मदद करे।

+0

अपने वांछित उत्पादन में , पहली पंक्ति में 'id' 2 होना चाहिए, है ना? – IanS

+0

हाँ। इसे ठीक किया .. इंगित करने के लिए धन्यवाद .. @jezrael ने भी एक अच्छा जवाब दिया है। –

उत्तर

5

आप कॉलम द्वारा groupby का उपयोग कर सकते हैं जो पहले नए index और अंतिम column बनाते हैं। तो किसी भी तरह से aggreagate की जरूरत है - मैं mean का उपयोग करें, फिर DataFrame.squeeze द्वारा एक कॉलम DataFrame से Series को परिवर्तित करें (फिर आवश्यक नहीं है कॉलम में मल्टीइंडेक्स के शीर्ष स्तर को हटाएं) और unstack द्वारा पुन: आकार दें। स्तंभ नाम के अंतिम add_suffix:

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 साथ एक अन्य समाधान है, तो list comprehension द्वारा स्तंभों से Multiindex हटाने की जरूरत है: set_index

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

धन्यवाद .. समूहby समाधान मेरे मामले को पूरी तरह से फिट करता है। पिवट समस्या का कारण बन सकता है क्योंकि मैं डेटा क्लस्टर करने की कोशिश कर रहा हूं। दूसरों के लिए यह समूह कैसे उपयोगी होगा इस बारे में कुछ स्पष्टीकरण। –

+0

ठीक है, मुझे ec के रूप में दें – jezrael

0

आप इस्तेमाल कर सकते हैं और unstack

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 
संबंधित मुद्दे