2016-04-05 8 views
5

मैं प्रपत्र की एक pandas.DataFrame हैवर्गीकृत डेटा मान द्वारा

low_bound high_bound name 
0   10   'a' 
10   20   'b' 
20   30   'c' 
30   40   'd' 
40   50   'e' 

मैं एक बहुत लंबे फार्म के pandas.Series है श्रृंखला निम्न_बाउंड/हाई_बाउंड/नाम डेटाफ्रेम के संबंध में इसके संबंधित नाम। यहाँ मेरी उम्मीद परिणाम है:

value   name 
5.7   'a' 
30.4   'd' 
21   'c' 
35.1   'd' 

दरअसल, 5.7 का नाम है 'एक' के बाद से 5.7 0 और 10 बाहर रखा के बीच है।

सबसे कुशल कोड क्या होगा? मुझे पता है कि मैं श्रृंखला के माध्यम से पुनरावृत्ति से समस्या का समाधान कर सकता हूं, लेकिन हो सकता है कि एक त्वरित वेक्टरियल समाधान है जो मुझसे बच रहा है।

ध्यान दें कि मेरी सीमाएं कस्टम और अनियमित हो सकती हैं। यहां वे उदाहरण के लिए नियमित हैं।

उत्तर

4

पांडा एक विधि cut कहा जाता है क्या करेंगे कि है कि आप क्या चाहते:

:

import pandas as pd 

data = [{"low": 0, "high": 10, "name": "a"}, 
     {"low": 10, "high": 20, "name": "b"}, 
     {"low": 20, "high": 30, "name": "c"}, 
     {"low": 30, "high": 40, "name": "d"}, 
     {"low": 40, "high": 50, "name": "e"},] 

myDF = pd.DataFrame(data) 

#data to be binned 
mySeries = pd.Series([5.7, 30.4, 21, 35.1]) 

#create bins from original data 
bins = list(myDF["high"]) 
bins.insert(0,0) 

print pd.cut(mySeries, bins, labels = myDF["name"]) 

आप निम्नलिखित है, जो आप फिर कुछ dataframe में वापस डाल दिया या फिर भी आप अपने डेटा रखने के लिए चाहते हैं कर सकते हैं दे देंगे कि

0 a 
1 d 
2 c 
3 d 
dtype: category 
Categories (5, object): [a < b < c < d < e] 

आपके डिब्बे अनियमित कैसे हैं (और आप वास्तव में कस्टम/अनियमित द्वारा क्या मतलब है) के आधार पर, आपको श्रृंखला के माध्यम से लूपिंग का सहारा लेना पड़ सकता है। मैं एक बिल्टिन के अपने सिर के शीर्ष पर नहीं सोच सकता जो आपके लिए इसे संभाल लेगा, विशेष रूप से यह दिया जाता है कि यह डिब्बे में अनियमितता की डिग्री/प्रकार पर निर्भर करता है।

for el in mySeries: 
    print myDF["name"][(myDF["low"] < el) & (myDF["high"] > el)] 

मुझे खुशी है कि आप एक विशाल श्रृंखला के माध्यम से पाश के लिए नहीं चाहते हो सकता है, लेकिन कम से कम:

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

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