गैर-अनन्य कॉलम में दिनांक द्वारा डेटा पंड्रेम प्रविष्टियों को समूह कैसे बनाएं


82

एक पंडों के DataFrameनाम में कॉलम होता "date"है जिसमें गैर-अद्वितीय datetimeमान होते हैं। मैं इस फ्रेम में लाइनों का उपयोग करके समूह कर सकता हूं:

data.groupby(data['date'])

हालाँकि, यह डेटा को datetimeमानों से विभाजित करता है । मैं इन आंकड़ों को "तिथि" कॉलम में संग्रहीत वर्ष तक समूह में रखना चाहूंगा। यह पृष्ठ दिखाता है कि ऐसे मामलों में साल-दर-साल कैसे समूहबद्ध किया जाता है, जहां टाइम स्टैम्प का उपयोग सूचकांक के रूप में किया जाता है, जो मेरे मामले में सही नहीं है।

मैं इस समूहन को कैसे प्राप्त करूं?


2017+ में आने वाले लोगों के लिए, किसी विशेष राशि को समूहबद्ध करने के कई नए तरीके हैं। इस जवाब को नीचे देखें
टेड पेट्रोउ

जवाबों:


91

मैं पांडा का उपयोग कर रहा हूं 0.16.2। मेरे बड़े डेटासेट पर इसका बेहतर प्रदर्शन है:

data.groupby(data.date.dt.year)

dtविकल्प का उपयोग करना और उसके साथ खेलना आदि weekofyear, dayofweekबहुत आसान हो जाता है।


कॉनकुर, यह एक श्रृंखला के लिए तारीख विशेषताओं तक पहुँचने का एक तरीका है।
dancow

74

ecatmur का घोल ठीक काम करेगा। यह बड़े डेटासेट पर बेहतर प्रदर्शन होगा, हालांकि:

data.groupby(data['date'].map(lambda x: x.year))

9
आवेदन के बजाय नक्शा क्यों?
गस

1
Afaik, mapआमतौर पर कुछ अच्छे दक्षता वाले गुण होते हैं जब सिर्फ उपयोग करने की तुलना में मनमाने कार्यों को लागू करना apply
कूलियो 2654

25

यह एक नमूना डाटासेट के साथ समझाने में आसान हो सकता है।

नमूना डेटा बनाएँ

मान लेते हैं कि हम साथ टाइमस्टैम्प का एकल स्तंभ, करते हैं date, और एक अन्य स्तंभ हम पर एक एकत्रीकरण प्रदर्शन करने के लिए चाहते हैं a

df = pd.DataFrame({'date':pd.DatetimeIndex(['2012-1-1', '2012-6-1', '2015-1-1', '2015-2-1', '2015-3-1']),
                   'a':[9,5,1,2,3]}, columns=['date', 'a'])

df

        date  a
0 2012-01-01  9
1 2012-06-01  5
2 2015-01-01  1
3 2015-02-01  2
4 2015-03-01  3

साल-दर-साल समूह बनाने के कई तरीके हैं

  • yearप्रॉपर्टी के साथ डीटी एक्सेसर का उपयोग करें
  • dateइंडेक्स में रखें और वर्ष तक पहुंचने के लिए अनाम फ़ंक्शन का उपयोग करें
  • प्रयोग resampleविधि
  • पांडा अवधि में परिवर्तित करें

.dtyearसंपत्ति के साथ गौण

जब आपके पास पांडा टाइमस्टैम्प का एक कॉलम (और इंडेक्स नहीं) होता है, तो आप एक्सेसर के साथ कई और अतिरिक्त गुणों और विधियों का उपयोग कर सकते हैं dt। उदाहरण के लिए:

df['date'].dt.year

0    2012
1    2012
2    2015
3    2015
4    2015
Name: date, dtype: int64

हम इसका उपयोग अपने समूह बनाने और किसी विशेष स्तंभ पर कुछ एकत्रीकरण की गणना करने के लिए कर सकते हैं:

df.groupby(df['date'].dt.year)['a'].agg(['sum', 'mean', 'max'])

      sum  mean  max
date                
2012   14     7    9
2015    6     2    3

सूचकांक में तारीख डालें और वर्ष तक पहुंचने के लिए अनाम फ़ंक्शन का उपयोग करें

यदि आप दिनांक स्तंभ को अनुक्रमणिका के रूप में सेट करते हैं, तो यह उसी गुणों और विधियों के साथ DateTimeIndex हो जाता है, जब अभिगमकर्ता dtसामान्य स्तंभ बनाता है

df1 = df.set_index('date')
df1.index.year

Int64Index([2012, 2012, 2015, 2015, 2015], dtype='int64', name='date')

दिलचस्प है, जब ग्रुपबी विधि का उपयोग करते हैं, तो आप इसे एक फ़ंक्शन पास कर सकते हैं। यह फ़ंक्शन अनुमानित रूप से डेटाफ्रेम के सूचकांक को पारित करेगा। तो, हम निम्नलिखित के साथ ऊपर से एक ही परिणाम प्राप्त कर सकते हैं:

df1.groupby(lambda x: x.year)['a'].agg(['sum', 'mean', 'max'])

      sum  mean  max
2012   14     7    9
2015    6     2    3

resampleविधि का प्रयोग करें

यदि आपका दिनांक स्तंभ अनुक्रमणिका में नहीं है, तो आपको onपैरामीटर के साथ कॉलम निर्दिष्ट करना होगा । आपको ऑफसेट उर्फ को एक स्ट्रिंग के रूप में निर्दिष्ट करने की भी आवश्यकता है ।

df.resample('AS', on='date')['a'].agg(['sum', 'mean', 'max'])

             sum  mean  max
date                       
2012-01-01  14.0   7.0  9.0
2013-01-01   NaN   NaN  NaN
2014-01-01   NaN   NaN  NaN
2015-01-01   6.0   2.0  3.0

पांडा अवधि में परिवर्तित करें

आप पंडों की अवधि ऑब्जेक्ट के लिए दिनांक स्तंभ भी परिवर्तित कर सकते हैं। पीरियड की लंबाई निर्धारित करने के लिए हमें ऑफसेट उपनाम में स्ट्रिंग के रूप में पास होना चाहिए।

df['date'].dt.to_period('A')

0   2012
1   2012
2   2015
3   2015
4   2015
Name: date, dtype: object

हम इसे एक समूह के रूप में उपयोग कर सकते हैं

df.groupby(df['date'].dt.to_period('Y'))['a'].agg(['sum', 'mean', 'max'])


      sum  mean  max
2012   14     7    9
2015    6     2    3

अंतिम पद्धति में जहां आप उपयोग करते हैं to_period('A'), वह ('ए') किसके लिए है?
shiv_90

2
@ शिव_90 'A'एक समयसीमा है ऑफसेट-उपनाम: pandas.pydata.org/pandas-docs/stable/…
ptim

यदि आपको किसी अलग 'तिथि' कॉलम की आवश्यकता है तो आप किस विधि की सिफारिश करेंगे? उदाहरण के लिए, यदि मैं सरल .dt.yearविधि चलाता हूं और इसे एक नए डेटा फ्रेम में सहेजता हूं, तो तिथियां सूचकांकों के रूप में सहेज ली जाती हैं और यह समस्याग्रस्त हो जाती है यदि कहें कि मुझे डेटा को प्लॉट करने की आवश्यकता है क्योंकि 'तिथियां' कॉलम वास्तव में नहीं है, लेकिन केवल तीन में प्रदान की.agg()
shiv_90


0

यह भी काम करेगा

data.groupby(data['date'].dt.year)


काम करना चाहिए लेकिन जब निष्पादित किया जाता है तो यह मेमोरी में ऑब्जेक्ट के स्थान को आउटपुट करता है लेकिन कोई वास्तविक आउटपुट नहीं। <pandas.core.groupby.DataFrameGroupBy object at 0x10d7f6438>निष्पादित होने पर मुझे क्या मिलता है।
shiv_90
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.