2016-04-05 63 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 
5.7 
30.4 
21 
35.1 

我想給你的每個值該系列與low_bound/high_bound /名稱DataFrame相對應的名稱。 這是我期望的結果:

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

事實上,5.7名是 'A',因爲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"]) 

這會給你的下面,然後你就可以放回一些數據幀或無論你想握住你的數據:

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)] 

我明白,你可能不通過一個巨大的一系列要循環,但至少我們不是手動編入數據框,這可能會讓事情變得更慢