2013-07-20 5 views
13

के निकट डेटाफ़्रेम में वापसी पंक्तियां मेरे पास एक उपयोगकर्ता परिभाषित संख्या है जिसे मैं डेटाफ्रेम के किसी निश्चित कॉलम से तुलना करना चाहता हूं।उपयोगकर्ता परिभाषित संख्या

मैं डेटाफ्रेम की पंक्तियों को वापस करना चाहता हूं जिसमें डीएफ, कहें, df.num के एक निश्चित कॉलम में दिए गए नंबर x के 5 निकटतम नंबर शामिल हैं।

लूप के बिना ऐसा करने का सबसे अच्छा तरीका किसी भी सुझाव की सराहना की जाएगी।

उत्तर

23

मुझे लगता है कि आप argsort विधि का उपयोग कर सकते हैं: अजगर और पांडा के लिए नए की

>>> df = pd.DataFrame({"A": 1e4*np.arange(100), "num": np.random.random(100)}) 
>>> x = 0.75 
>>> df.ix[(df.num-x).abs().argsort()[:5]] 
     A  num 
66 660000 0.748261 
92 920000 0.754911 
59 590000 0.764449 
27 270000 0.765633 
82 820000 0.732601 
>>> x = 0.33 
>>> df.ix[(df.num-x).abs().argsort()[:5]] 
     A  num 
37 370000 0.327928 
76 760000 0.327921 
8 80000 0.326528 
17 170000 0.334702 
96 960000 0.324516 
+1

मान लीजिए कि हम इसे 5 निकटतम पंक्तियां देने के लिए सामान्य बनाना चाहते हैं (जब हमारे पास एन इनपुट होते हैं और हम निकटता को अलग-अलग कॉलम में मापना चाहते हैं)। क्या आप अभी भी ऐसा करेंगे? यदि n = 2 (कहें, x = 0.75, y = 5.0) - "और" df.ix [(df.num1-x) .abs() का उपयोग करना सबसे आसान है। Argsort() [: 5] & (df.num2-y) .abs()। argsort() [: 5]]? धन्यवाद! –

+1

क्या पांडा इंटरफ़ेस बदल गया था? मुझे 'df.ix' के बजाय' df.iloc' का उपयोग करने की आवश्यकता है अन्यथा फ़ील्ड सभी 'NaN' हैं। – swenzel

+1

आह मुझे लगता है कि समस्या मेरे डीएफ की अनुक्रमणिका के साथ है, यह 'रेंज (लेन (डीएफ)) जैसे अनुक्रम नहीं है। हालांकि, 'iloc' दोनों "सामान्य" अनुक्रमणिका और मेरी अनुक्रमणिका दोनों के साथ काम करता प्रतीत होता है। मैं पांडा के साथ बहुत अनुभवी नहीं हूं लेकिन इस व्यवहार से पता चलता है कि 'iloc' का उपयोग करना अधिक स्थिर होगा? – swenzel

3

तरह है, लेकिन मैं यह सुझाव है।

#make random df and get number 
df = pd.DataFrame({'c1':0,'c2':np.random.random(100)}) 
x = .25 
#find differences and sort 
diff = df.c2.apply(lambda z: abs(x-z)) 
diff.sort() 
#get the index for the 5 closest numbers 
inds = diff.index[:5] 

inds फिर 5 निकटतम संख्या के लिए मूल df से सूचकांक स्थानों के लिए होगा। उम्मीद है की यह मदद करेगा!

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