首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >离散变量的分类算法

离散变量的分类算法
EN

Code Review用户
提问于 2017-03-15 09:29:09
回答 1查看 357关注 0票数 3

我正在尝试对一些数据进行分类。为此,我检查数据的分布情况。然后,我根据每个值的出现次数进行拆分。到目前为止,我所使用的算法工作得很慢。我想提高速度。速度是非常重要的,因为我使用相同的结构处理许多不同的数据,而且数据有点大(140 k行)。

代码语言:javascript
复制
def RamsesIdCategory(data):
    # handling Ramses Id:
    print('Starting Ramses Id')
    valueRamses = data['Ramses Trade Id'].unique()
    countRamses = data['Ramses Trade Id'].value_counts()
    for value in valueRamses:
        if countRamses.get(value) < 2:
            data['Ramses Trade Id'].loc[data['Ramses Trade Id'] == value] = 1
        elif 2 <= countRamses.get(value) < 5:
            data['Ramses Trade Id'].loc[data['Ramses Trade Id'] == value] = 2
        elif 5 <= countRamses.get(value) < 10:
            data['Ramses Trade Id'].loc[data['Ramses Trade Id'] == value] = 3
        elif 10 <= countRamses.get(value) < 20:
            data['Ramses Trade Id'].loc[data['Ramses Trade Id']== value] = 4
        elif 20 <= countRamses.get(value) < 32:
            data['Ramses Trade Id'].loc[data['Ramses Trade Id']== value] = 5
        else:
            data['Ramses Trade Id'].loc[data['Ramses Trade Id'] == value] = 6
    print('finished Ramses Id')
    return data

编辑:我重新编写了我的代码,因为我知道循环对我的行进行了太多的迭代是有问题的。以下是新版本:

代码语言:javascript
复制
def RamsesIdCategory(data):
    # handling Ramses Id:
    print('Starting Ramses Id')
    valueRamses= data['Ramses Trade Id'].value_counts()
    for i in data.index:
        if valueRamses.get(data.get_value(i,'Ramses Trade Id'))<2:
            data.set_value(i,'Ramses Trade Id',1)
        elif 2<=valueRamses.get(data.get_value(i,'Ramses Trade Id'))<5:
            data.set_value(i, 'Ramses Trade Id', 2)
        elif 5 <= valueRamses.get(data.get_value(i, 'Ramses Trade Id')) < 10:
            data.set_value(i, 'Ramses Trade Id', 3)
        elif 10<= valueRamses.get(data.get_value(i, 'Ramses Trade Id')) < 20:
            data.set_value(i, 'Ramses Trade Id', 4)
        elif 20 <= valueRamses.get(data.get_value(i, 'Ramses Trade Id')) < 32:
            data.set_value(i, 'Ramses Trade Id', 5)
        else:
            data.set_value(i, 'Ramses Trade Id', 6)
     return(data)

我对整个数据集进行了一次迭代,并进行了一次选择和修改,而不是试图对每个不同的值对整个数据进行多次修改。它比50分钟快100倍,因为它在几秒钟内运行。

EN

回答 1

Code Review用户

回答已采纳

发布于 2017-03-15 15:04:30

代码可以使用apply进行很大程度的简化。但是首先,您需要一种更好的方法来测试您的值并为它们分配一个id:

代码语言:javascript
复制
def convert_count_to_id(count, limits=(2, 5, 10, 20, 32)):
    for id, limit in enumerate(limits, 1):
        if count < limit:
            return id
    return id + 1

这相当于你的elifs链,但更难出错。

现在,您的功能可以变成:

代码语言:javascript
复制
def ramses_id_category(data):
    serie_name = 'Ramses Trade Id'
    value_ramses = data[serie_name].value_counts()
    id_ramses = values_ramses.apply(convert_count_to_id)
    data[serie_name] = data[serie_name].apply(id_ramses.get)

请注意,我在最后删除了return data。由于您正在对参数进行适当的变异,因此不需要返回它,因为调用方将能够在调用此函数时看到它们持有的引用上的更改。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/157790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档