2013-03-06 10 views
12

मैंने हाल ही में आर से पायथन तक स्विच किया है और आर के डेटाटेबल का उपयोग करने के विरोध में फिर से डेटा फ्रेम में उपयोग करने में कुछ परेशानी हो रही है। मेरी समस्या यह है कि मैं स्ट्रिंग्स की एक सूची लेना चाहता हूं, एक मान की जांच करूँगा, फिर उस स्ट्रिंग की गिनती को जोड़ दूंगा- उपयोगकर्ता द्वारा टूटा हुआ।पांडा के लिए सशर्त रकम कुल

A_id  B C 
1: a1 "up" 100 
2: a2 "down" 102 
3: a3 "up" 100 
3: a3 "up" 250 
4: a4 "left" 100 
5: a5 "right" 102 

और वापसी:: तो मैं इस डेटा लेना चाहते हैं

A_id_grouped sum_up sum_down ... over_200_up 
1:   a1  1   0 ...   0 
2:   a2  0   1     0 
3:   a3  2   0 ...   1 
4:   a4  0   0     0 
5:   a5  0   0 ...   0 

इससे पहले कि मैं आर कोड के साथ यह किया (data.table का उपयोग कर)

>DT[ ,list(A_id_grouped, sum_up = sum(B == "up"), 
+ sum_down = sum(B == "down"), 
+ ..., 
+ over_200_up = sum(up == "up" & < 200), by=list(A)]; 
हालांकि

के सभी पाइथन के साथ मेरे हालिया प्रयासों ने मुझे असफल कर दिया है:

DT.agg({"D": [np.sum(DT[DT["B"]=="up"]),np.sum(DT[DT["B"]=="up"])], ... 
    "C": np.sum(DT[(DT["B"]=="up") & (DT["C"]>200)]) 
    }) 

अग्रिम धन्यवाद! यह एक साधारण सवाल की तरह लगता है हालांकि मुझे इसे कहीं भी नहीं मिला।

उत्तर

14

unutbu के जवाब की मदद के लिए यहाँ GroupBy वस्तु पर apply का उपयोग कर एक तरीका है।

>>> df.groupby('A_id').apply(lambda x: pd.Series(dict(
    sum_up=(x.B == 'up').sum(), 
    sum_down=(x.B == 'down').sum(), 
    over_200_up=((x.B == 'up') & (x.C > 200)).sum() 
))) 
     over_200_up sum_down sum_up 
A_id        
a1    0   0  1 
a2    0   1  0 
a3    1   0  2 
a4    0   0  0 
a5    0   0  0 
6

एक बेहतर तरीका हो सकता है; मैं बहुत पांडा के लिए नया हूँ, लेकिन यह काम करता है:

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'A_id':'a1 a2 a3 a3 a4 a5'.split(), 
        'B': 'up down up up left right'.split(), 
        'C': [100, 102, 100, 250, 100, 102]}) 

df['D'] = (df['B']=='up') & (df['C'] > 200) 
grouped = df.groupby(['A_id']) 

def sum_up(grp): 
    return np.sum(grp=='up') 
def sum_down(grp): 
    return np.sum(grp=='down') 
def over_200_up(grp): 
    return np.sum(grp) 

result = grouped.agg({'B': [sum_up, sum_down], 
         'D': [over_200_up]}) 
result.columns = [col[1] for col in result.columns] 
print(result) 

पैदावार

 sum_up sum_down over_200_up 
A_id        
a1   1   0   0 
a2   0   1   0 
a3   2   0   1 
a4   0   0   0 
a5   0   0   0 
संबंधित मुद्दे