首页 > 解决方案 > 根据字符串上的特定条件删除行

问题描述

给定这个数据框(这是我的一个子集):

用户名 用户信息
波洛普 我喜欢这张照片,非常漂亮
阿蒂尔
阿廷戈 Es un cuadro preciosa, me recuerda a mi infancia。
佐纳 我喜欢
所以我 哎呀,说我讨厌它是一种委婉说法
伊尤

我想要做的是删除一些单词(标记)少于 5 个单词并且不是用英语写的行。我对熊猫不熟悉,所以我想出了一个不太好的解决方案:

import pandas as pd
from langdetect import detect
index = 0
index_list = []
for review in df["user_message"]:
    count = 0
    if str(review) == "NaN":
        index_list.append(index)
        continue
    for i in review:
        if(i.isspace()):
            count=count+1
    if len(review) == 0:
        index_list.append(index)
    elif review.isspace() is True:
        index_list.append(index)
    elif count < 5:
        index_list.append(index)
    else:
        try:
            detect(review)
            if detect(review) != "en":
                index_list.append(index)
            else:
                pass
        except:
            pass
    index = index + 1
df = df.drop(index_list, axis = 0).reset_index(drop = True)

这个解决方案显然不起作用(我的数据框和行中只有一个单词的空白行),我确信它存在另一种有效的方法,那就是更快。你知道如何解决这个问题吗?

谢谢你。

编辑:所以我终于让它工作了,感谢@ansev的回答。由于如果发送的请求过多,TextBlob 会引发错误,因此我依赖 langdetect 模块。下面是对应的代码:

m1 = df['user_message'].str.split(' ').str.len() > 5 
m2 = df['user_message'].str.isspace() 
df_filtered = df.loc[m1 | m2 == False].reset_index(drop=True) 
m3 = df_filtered['user_message'].astype(str).apply(lambda x: detect(x) if len(x) >= 5).eq('en')
df_filtered = df_filtered.loc[m3].reset_index(drop=True)

我必须单独执行 m3,因为如果检测无法识别文本,则会引发错误(这通常是由仅包含空格的字符串引起的,这是我的 m2 条件,它检查单元格是否仅包含空格(因此返回 True如果是这样))。

标签: pythonpandas

解决方案


利用:

from textblob import TextBlob
m1 = df['user_message'].astype(str).apply(lambda x: TextBlob(x).detect_language() 
                                          if len(x) >= 3 else '').eq('en') 
m2 = df['user_message'].str.split(' ').str.len() > 5
df_filtered = df.loc[m1 | m2]
print(df_filtered)

  username                                       user_message
0    Polop       I love this picture, which is very beautiful
2  Artingo  Es un cuadro preciosa, me recuerda a mi infancia.
3     Zona                                          I like it
4      Soi        Yuck, to say I hate it would be a euphemism

检查安装

没有名为 textblob 的模块


推荐阅读