कम नहीं करता है मैं एक समेकन फ़ंक्शन का उपयोग कर रहा हूं जिसे मैंने लंबे समय से अपने काम में उपयोग किया है। विचार यह है कि यदि समारोह में पारित श्रृंखला लंबाई 1 है (यानी समूह में केवल एक अवलोकन है) तो अवलोकन वापस कर दिया जाता है। यदि श्रृंखला पारित की लंबाई एक से अधिक है, तो अवलोकन एक सूची में वापस कर दिया जाता है।पांडस ग्रुपबी एजीजी फंक्शन
यह कुछ के लिए अजीब लग सकता है, लेकिन यह एक्स, वाई समस्या नहीं है, मेरे पास ऐसा करने के लिए अच्छा कारण है जो इस प्रश्न से प्रासंगिक नहीं है।
def MakeList(x):
""" This function is used to aggregate data that needs to be kept distinc within multi day
observations for later use and transformation. It makes a list of the data and if the list is of length 1
then there is only one line/day observation in that group so the single element of the list is returned.
If the list is longer than one then there are multiple line/day observations and the list itself is
returned."""
L = x.tolist()
if len(L) > 1:
return L
else:
return L[0]
अब किसी कारण से, वर्तमान डेटा सेट मैं मैं पर काम कर रहा हूँ के साथ मिल एक ValueError करते हुए कहा कि समारोह को कम नहीं करता:
इस समारोह है कि मैं का उपयोग किया गया है। यहाँ कुछ परीक्षण डाटा और शेष चरणों मैं उपयोग कर रहा हूँ है:
import pandas as pd
DF = pd.DataFrame({'date': ['2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02'],
'line_code': ['401101',
'401101',
'401102',
'401103',
'401104',
'401105',
'401105',
'401106',
'401106',
'401107'],
's.m.v.': [ 7.760,
25.564,
25.564,
9.550,
4.870,
7.760,
25.564,
5.282,
25.564,
5.282]})
DFGrouped = DF.groupby(['date', 'line_code'], as_index = False)
DF_Agg = DFGrouped.agg({'s.m.v.' : MakeList})
इस डिबग करने के लिए कोशिश कर रहा में, मैं print L
और print x.index
और के प्रभाव आउटपुट के रूप में था करने के लिए एक प्रिंट बयान डाल इस प्रकार है:
[7.7599999999999998, 25.564]
Int64Index([0, 1], dtype='int64')
[7.7599999999999998, 25.564]
Int64Index([0, 1], dtype='int64')
किसी कारण से ऐसा लगता है कि agg
फ़ंक्शन में श्रृंखला को दो बार गुजर रहा है। जहां तक मुझे पता है कि यह बिल्कुल सामान्य नहीं है, और संभवत: मेरा कार्य कम नहीं होने का कारण है।
उदाहरण के लिए अगर मैं इस तरह एक समारोह लिखें:
def test_func(x):
print x.index
return x.iloc[0]
यह समस्या के बिना चलाता है और प्रिंट बयान कर रहे हैं:
DF_Agg = DFGrouped.agg({'s.m.v.' : test_func})
Int64Index([0, 1], dtype='int64')
Int64Index([2], dtype='int64')
Int64Index([3], dtype='int64')
Int64Index([4], dtype='int64')
Int64Index([5, 6], dtype='int64')
Int64Index([7, 8], dtype='int64')
Int64Index([9], dtype='int64')
जो इंगित करता है कि प्रत्येक समूह में ही एक के रूप में एक बार पारित किया जा रहा है समारोह के लिए श्रृंखला।
क्या कोई मुझे यह समझने में सहायता कर सकता है कि यह क्यों विफल रहा है? मैं कई डेटा सेट के साथ मैं ....
धन्यवाद काम में सफलता के साथ इस समारोह का इस्तेमाल किया है
यह संभव है कि यदि आपका कार्य कभी-कभी एक सूची और कभी-कभी एक मूल्य लौटाता है तो पांडा भ्रमित हो जाते हैं, क्योंकि उन दो मामलों के लिए अलग-अलग प्रकार का उपयोग किया जाएगा। यह संभवतः ऐसा करने के लिए बेहतर नहीं है। कॉलिंग-दो बार व्यवहार [लागू] के लिए वर्णित मुद्दे से संबंधित हो सकता है [http://stackoverflow.com/questions/21390035/python-pandas-groupby-object-apply-method-duplicates- फर्स्ट- समूह) 'लागू' के लिए : यह जांचने के लिए कि क्या फ़ंक्शन मौजूदा डेटा को बदलता है या नहीं, यह पहले समूह पर फ़ंक्शन को दो बार कॉल करता है। – BrenBarn
हमम .... मुझे शायद वस्तु प्रकार के रूप में सेट करने का प्रयास करना चाहिए। –
अजीब बात यह है कि, मैं इस समस्या को हर समय बिना किसी समस्या के पुन: उपयोग करता हूं। मुझे पता है कि डेटा के अलग-अलग पैकेट को पास और ट्रांसफर करना है, जैसे कि प्रिंट स्टेटमेंट्स से पता लगाना मुश्किल है, लेकिन एह काफी सरल है। क्या आप त्रुटि को फिर से बनाने में सक्षम थे? –