2013-06-09 8 views
9

अपने डेटा के कुछ लगता है कि:अजगर पांडा - विलय ज्यादातर दोहराया पंक्तियों

date, name, value1, value2, value3, value4 
1/1/2001,ABC,1,1,, 
1/1/2001,ABC,,,2, 
1/1/2001,ABC,,,,35 

मैं लेकिन, जहां मैं

data.set_index(['date', 'name']) 

चला सकते हैं बात करने के लिए प्राप्त करने के लिए कोशिश कर रहा हूँ के रूप में डेटा के साथ -इस, निश्चित रूप से डुप्लिकेट हैं (जैसा उपरोक्त में दिखाया गया है), इसलिए मैं यह नहीं कर सकता (और मैं डुप्लिकेट वाले इंडेक्स नहीं चाहता हूं, और मैं बस ड्रॉप-डुप्लिकेट() नहीं कर सकता, क्योंकि यह डेटा खो देगा)।

मैं उन पंक्तियों को मजबूर करने में सक्षम होना चाहूंगा जिनके पास एक ही पंक्ति में समान [तारीख, नाम] मान हैं, यदि उन्हें NaN होने वाले कुछ मूल्यों के आधार पर सफलतापूर्वक एकत्रित किया जा सकता है (combine_first() के व्यवहार के समान) । जैसे, ऊपर

date, name, value1, value2, value3, value4 
1/1/2001,ABC,1,1,2,35 

पर खत्म होगा दो मान भिन्न हैं और एक NaN नहीं है, तो दो पंक्तियों अभिसरित नहीं किया जाना चाहिए (यह शायद एक त्रुटि है कि मैं पर नजर रखने की आवश्यकता होगी होगा)।

(ऊपर के उदाहरण का विस्तार करने के लिए, वहाँ वास्तव में लाइनों की एक मनमाना संख्या हो सकता है - स्तंभों की एक मनमाना संख्या को देखते हुए -। जो एक ही पंक्ति में कन्वर्ज्ड जा करने के लिए सक्षम होना चाहिए)

यह महसूस करता है ऐसी समस्या की तरह जो पांडा के माध्यम से बहुत ही सुलभ हो, लेकिन मुझे एक सुरुचिपूर्ण समाधान की तलाश में परेशानी हो रही है।

उत्तर

11

आइए कल्पना करें कि आपके पास कुछ फ़ंक्शन combine_it है, जो पंक्तियों का एक सेट दिया गया है जिसमें डुप्लिकेट मान होंगे, एक पंक्ति लौटाएंगे। सबसे पहले, date और name द्वारा समूह:

grouped = data.groupby(['date', 'name']) 

तो बस एकत्रीकरण समारोह और उछाल आपका काम हो गया लागू होते हैं:

result = grouped.agg(combine_it) 

तुम भी agg पास करके विभिन्न स्तंभों के लिए विभिन्न एकत्रीकरण कार्यों प्रदान कर सकते हैं एक ताना

+0

धन्यवाद, यह निश्चित रूप से एक महत्वपूर्ण कदम को कम करता है। क्या ऐसा करने के लिए एक विशेष रूप से कुशल मुहावरे है? मेरे अनुभव में (और आपके सुझाव का उपयोग करके प्रारंभिक परीक्षण), .agg() वास्तव में धीमी निष्पादन (शायद असुरक्षित रूप से) हो सकता है। शायद अपरिहार्य? – severian

+0

शायद? आप इसे गति देने के लिए बिल्टिन numpy फ़ंक्शंस ("sum", "max", आदि) का उपयोग करने का प्रयास कर सकते हैं (जो साइथोनिज्ड फ़ंक्शंस का उपयोग करता है)। यह संभवतः समूह के लिए सामान्य उपयोग के मामले के बाहर है क्योंकि आप शायद डेटाफ्रेम के कुल आकार के सापेक्ष कई समूहों के साथ समाप्त हो जाते हैं। –

+0

ठीक है, एक और जवाब छोड़कर, कम से कम मुझे पता है कि मैंने कुछ भी स्पष्ट नहीं किया है ... – severian

0

यदि आपके पास संख्यात्मक फ़ील्ड मान नहीं हैं, तो गिनती, न्यूनतम, योग आदि के साथ समेकित न तो संभव और न ही समझदार होगा। फिर भी, आप अभी भी एक या अधिक प्राथमिक कुंजी के आधार पर व्यक्तिगत रिकॉर्ड (उदा।) पर डुप्लिकेट रिकॉर्ड को पतन करना चाहते हैं।

# Firstly, avoid Nan values in the columns you are grouping on! 
df[['col1', 'col2']] = df[['col1', 'col2']].fillna('null') 


    # Define your own customized operation in pandas agg() function 
df = df.groupby(['col1', 'col2']).agg({'SEARCH_TERM':lambda x: ', '.join(tuple(x.tolist())), 

            'HITS_CONTENT':lambda x: ', '.join(tuple(x.tolist()))} 
            ) 

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

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