按pandas中的值对数据进行分类

时间:2016-04-05 09:08:16

标签: python pandas

我有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之间排除。

什么是最有效的代码?我知道我可以通过迭代系列解决问题,但也许有一个更快的矢量解决方案可以逃避我。

最后注意我的界限可以是自定义和不规则的。为了这个例子,他们在这里是常规的。

2 个答案:

答案 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)