我有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 / name DataFrame相关的相应名称。 这是我的预期结果:
value name
5.7 'a'
30.4 'd'
21 'c'
35.1 'd'
实际上,5.7名称是'a',因为5.7在0到10之间排除。
什么是最有效的代码?我知道我可以通过迭代系列解决问题,但也许有一个更快的矢量解决方案可以逃避我。
最后注意我的界限可以是自定义和不规则的。为了这个例子,他们在这里是常规的。
答案 0 :(得分:4)
Pandas有一个名为var youroption = 'webdav';
function getUrl(youroption) {
return Routing.generate('user_files',{'oc': youroption});
}
function createPost(url) {
return $.post(
url,
{
restUrl : "/external-api-url/",
method: 'POST',
params: {
action: "getFiles"
}
},
'json'
)
}
$("#yourSubmitButton").on('click', function() {
var mypost = createPost(getUrl(youroption));
mypost.done(function(data){
....yourcode...;
...yourcode...;
youroption = data[0][j].name;
})
}
的方法可以做你想做的事情:
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]
我很欣赏你可能不想在一个庞大的系列中循环,但至少我们不会手动索引到数据帧,这可能会使事情变得更慢
答案 1 :(得分:0)
您可以做到
buckets = [0, 10, 20, 30, 40]
buckets_name = ['a', 'b', 'c', 'd']
pd.cut(your_series, buckets , labels = buckets_name)