2014-10-05 12 views
5

मैं एक सामान्य dfपांडस में एकाधिक कॉलम में एकाधिक फ़ंक्शन लागू करने के लिए समूहबी का उपयोग कैसे करें?

A = pd.DataFrame([[1, 5, 2], [2, 4, 4], [3, 3, 1], [4, 2, 2], [5, 1, 4]], 
       columns=['A', 'B', 'C'], index=[1, 2, 3, 4, 5]) 

this recipe के बाद है, मैं परिणाम मैं चाहता था मिल गया।

In [62]: A.groupby((A['A'] > 2)).apply(lambda x: pd.Series(dict(
        up_B=(x.B >= 0).sum(), down_B=(x.B < 0).sum(), mean_B=(x.B).mean(), std_B=(x.B).std(), 
        up_C=(x.C >= 0).sum(), down_C=(x.C < 0).sum(), mean_C=(x.C).mean(), std_C=(x.C).std()))) 

Out[62]: 
     down_B down_C mean_B mean_C  std_B  std_C up_B up_C 
A                  
False  0  0  4.5 3.000000 0.707107 1.414214  2  2 
True  0  0  2.0 2.333333 1.000000 1.527525  3  3 

यह दृष्टिकोण ठीक है, लेकिन कल्पना करें कि आप स्तंभों की एक बड़ी संख्या (15-100) के लिए यह करने के लिए किया था, तो आप सूत्र है, जो बोझिल हो सकता है में सभी सामान टाइप करने के लिए की है।

यह देखते हुए कि सभी कॉलम सभी कॉलम पर लागू होते हैं। क्या बड़ी संख्या में कॉलम के लिए ऐसा करने का कोई प्रभावी तरीका है?

धन्यवाद

उत्तर

9

आप एक मूल्य में प्रत्येक वर्गीकृत किया स्तंभ एकत्रित कर रहे हैं के बाद से, आप apply के बजाय agg उपयोग कर सकते हैं। The agg method इनपुट के रूप में कार्यों की एक सूची ले सकते हैं। कार्यों प्रत्येक स्तंभ करने के लिए लागू किया जाएगा:

def up(x): 
    return (x >= 0).sum() 
def down(x): 
    return (x < 0).sum() 

result = A.loc[:, 'B':'C'].groupby((A['A'] > 2)).agg(
      [up, down, 'mean', 'std']) 
print(result) 

पैदावार

 B      C       
     up down mean  std up down  mean  std 
A              
False 2 0 4.5 0.707107 2 0 3.000000 1.414214 
True 3 0 2.0 1.000000 3 0 2.333333 1.527525 

result श्रेणीबद्ध ("MultiIndexed") कॉलम है। एक निश्चित स्तंभ (या स्तंभों) का चयन करने के लिए, आप इस्तेमाल कर सकते हैं:

In [39]: result['B','mean'] 
Out[39]: 
A 
False 4.5 
True  2.0 
Name: (B, mean), dtype: float64 

In [46]: result[[('B', 'mean'), ('C', 'mean')]] 
Out[46]: 
     B   C 
     mean  mean 
A     
False 4.5 3.000000 
True 2.0 2.333333 

या आप अनुक्रमण करने के MultiIndex में से एक स्तर को स्थानांतरित कर सकते हैं:

In [40]: result.stack() 
Out[40]: 
        B   C 
A        
False up 2.000000 2.000000 
     down 0.000000 0.000000 
     mean 4.500000 3.000000 
     std 0.707107 1.414214 
True up 3.000000 3.000000 
     down 0.000000 0.000000 
     mean 2.000000 2.333333 
     std 1.000000 1.527525 
+0

यह बहुत स्पष्ट है। धन्यवाद। – hernanavella

संबंधित मुद्दे