使用str.contains将字符串的一部分替换为分隔符

时间:2018-03-28 14:48:51

标签: python regex string pandas scikit-learn

在我转向excel宏的可怕世界之前,你是我最后的希望堡垒,

我有一个来自excel的庞大数据框架,我正在操纵,Pandas已被证明对编辑很有用,因为excel真的很挣扎。

我的最后一期如下:

现在,我有一个列,列出超过100k行的用户兴趣。问题是数据从未被验证过,所以我有可能需要操作10个输出之一的有用信息。

我发现使用str.replacestr.contains非常有用,我想我会构建一些dicts或list来迭代来处理逻辑。

当我在str.contains上使用list时,它会替换整个string,我需要在分隔符之后保留信息以进行替换(因为用户可以拥有多个兴趣)。

所以我可以

User, Interest 
a     Racing, Football, Soccer, Kickball, footy, Basketball, Hockey, Running, Jogging, Jogging & Running 
b      Racing, Jogging, Basketball, Computers, Reading. 
c     Ice Hockey
例如,有多个足球的例子需要放入一个类别,依此类推。

假设我们只是在运动之后,那么清理非运动数据的有效方法是什么呢?

我希望我的整个问题都有道理。

输出:

User, Interest
a      Race, Ball Sport, Athletics
b      Race, Ball Sport, Athletics
c      Athletics 

1 个答案:

答案 0 :(得分:3)

我不知道你是想通过修改它来清理文件,还是想在运行时有选择地过滤兴趣,但是我会这样做:

  • 首先,我会获得所有兴趣的排序(且唯一)列表:将所有这些列表复制到一个文件中,每行一个,然后在Bash中运行一些sort -u FILE > OUTPUT
  • 然后我会重新组合兴趣(Racing和Race => Race)
  • 通过这些组,我将在Python中创建一个带字典的映射:

    mapping = {
        'racing': 'Race',
        'race': 'Race',
        'football': 'Ball Sport',
        ...
    }
    
  • 最后,在阅读文件时,我会使用函数返回每行的验证兴趣:

    def validate_interests(*interests):
        validated = []
        for interest in interests:
            valid = mapping.get(interest.lower(), None)
            if valid is not None:
                validated.append(valid)
        return validated
    
    
    In [10]: validate_interests('Football', 'Racing')
    Out[10]: ['Ball Sport', 'Race']
    

当然,您需要对这些行进行迭代并将其解析为一系列兴趣,但我不会过多介绍细节。