2012-12-21 15 views
20

के लिए रोलिंग फ़ंक्शन मेरे पास <pandas.core.groupby.SeriesGroupBy object at 0x03F1A9F0> प्रकार की टाइम श्रृंखला ऑब्जेक्ट grouped है। grouped.sum() वांछित परिणाम देता है लेकिन मुझे groupby ऑब्जेक्ट के साथ काम करने के लिए रोलिंग_सम नहीं मिल सकता है। groupby ऑब्जेक्ट्स पर रोलिंग फ़ंक्शंस को लागू करने का कोई तरीका है? उदाहरण के लिए:पायथन - ग्रुपबी ऑब्जेक्ट

x = range(0, 6) 
id = ['a', 'a', 'a', 'b', 'b', 'b'] 
df = DataFrame(zip(id, x), columns = ['id', 'x']) 
df.groupby('id').sum() 
id x 
a 3 
b 12 

हालांकि, मैं की तरह कुछ करना चाहते हैं:

id x 
0 a 0 
1 a 1 
2 a 3 
3 b 3 
4 b 7 
5 b 12 
+0

समूहबद्ध वस्तुओं पर काम करने के लिए आप रोलिंग फ़ंक्शन की अपेक्षा कैसे करते हैं (मेरा मतलब गणित वाई लिखना है कहां प्रतीकों में करना चाहते हैं)? – tacaswell

+0

क्षमा करें मुझे और अधिक स्पष्ट होना चाहिए था। – ezbentley

+0

तो आप प्रत्येक समूह पर 'cumsum' करना चाहते हैं और फिर पूरी चीज को एक डेटा फ्रेम में वापस सिलाई करना चाहते हैं? – tacaswell

उत्तर

25
In [16]: df.groupby('id')['x'].apply(pd.rolling_mean, 2, min_periods=1) 
Out[16]: 
0 0.0 
1 0.5 
2 1.5 
3 3.0 
4 3.5 
5 4.5 

In [17]: df.groupby('id')['x'].cumsum() 
Out[17]: 
0  0 
1  1 
2  3 
3  3 
4  7 
5 12 
+8

pd.rolling_mean अब श्रृंखला के लिए बहिष्कृत है और हटा दिया जाएगा, 'df.groupby (' id ') [' x '] का उपयोग करें। रोलिंग (2) .mean() 'इसके बजाय – kekert

1

मैं यांत्रिकी के यकीन नहीं है, लेकिन यह काम करता है। नोट, लौटाया मूल्य सिर्फ एक अंडाकार है। मुझे लगता है कि आप इस तरीके से किसी भी संचयी या "रोलिंग" फ़ंक्शन को लागू कर सकते हैं और इसका एक ही परिणाम होना चाहिए।

मैं cumprod, cummax और cummin साथ यह परीक्षण किया है और वे सभी एक ndarray लौट आए। मुझे लगता है कि पांडा यह समझने के लिए काफी समझदार हैं कि ये कार्य एक श्रृंखला लौटाते हैं और इसलिए कार्य को एकत्रीकरण के बजाय एक परिवर्तन के रूप में लागू किया जाता है।

In [35]: df.groupby('id')['x'].cumsum() 
Out[35]: 
0  0 
1  1 
2  3 
3  3 
4  7 
5 12 

संपादित करें: मैंने पाया यह उत्सुक है कि इस वाक्य रचना एक श्रृंखला वापसी करता है:

In [54]: df.groupby('id')['x'].transform('cumsum') 
Out[54]: 
0  0 
1  1 
2  3 
3  3 
4  7 
5 12 
Name: x 
22

Googlers के जो इस वर्ष प्रश्न पर आ के लिए:

के बारे में पर @ kekert की टिप्पणी @ गेटेट के नए

df.groupby('id')['x'].rolling(2).mean() 
का उपयोग करने का उत्तर

बजाय दिलचस्प अब पदावनत

df.groupby('id')['x'].apply(pd.rolling_mean, 2, min_periods=1) 

, ऐसा लगता है कि नए .rolling()। मतलब() दृष्टिकोण एक बहु अनुक्रमित श्रृंखला, पहले group_by स्तंभ द्वारा अनुक्रमित और उसके बाद सूचकांक देता है। हालांकि, पुराना दृष्टिकोण मूल डीएफ इंडेक्स द्वारा एकल रूप से अनुक्रमित श्रृंखला को वापस कर देगा, जो शायद कम समझ में आता है, लेकिन मूल श्रृंखला में एक नए कॉलम के रूप में उस श्रृंखला को जोड़ने के लिए इसे बहुत सुविधाजनक बना दिया।

तो मुझे लगता है मैं एक समाधान नई रोलिंग() विधि का उपयोग करता है और अभी भी है कि खोज निकाला है काम करता है एक ही:

df.groupby('id')['x'].rolling(2).mean().reset_index(0,drop=True) 

जो आप श्रृंखला

0 0.0 
1 0.5 
2 1.5 
3 3.0 
4 3.5 
5 4.5 

देना चाहिए आप जो कॉलम के रूप में जोड़ सकते हैं:

df['x'] = df.groupby('id')['x'].rolling(2).mean().reset_index(0,drop=True) 
+0

मुझे लगता है कि आप' .transform' का उपयोग कर सकते हैं reset_index के बजाय? – TMrtSmith

+1

यह वास्तव में विफल रहता है यदि आप एकाधिक कॉलम द्वारा समूहित कर रहे हैं। पहले तर्क (स्तर) को छोड़ना यह हल करता है हालांकि यह डिफ़ॉल्ट रूप से सभी स्तरों को हटा देता है। तो लाइन 'df ['x'] = df.groupby ('id') ['x'] बन जाती है। रोलिंग (2) .mean()। Reset_index (ड्रॉप = True)' –

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