首页 > 解决方案 > 使用 pandas 加快数百万行的过滤过程

问题描述

我正在尝试使用建议的解决方案来回答我最近在 StackOverflow 上提出的问题:(根据字符串的特定条件删除行)。

鉴于下面的数据框,我试图只删除 user_message 字符串少于五个单词或不是用英语编写的行:

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

下面是相应的代码:

import pandas as pd
from langdetect import detect
df = pd.read_csv("sample.csv")
m1 = df.index[df['user_message'].str.split(' ').str.len() > 5]
df_filtered = df.loc[m1]
del m1
del df
m2 = df_filtered['user_message'].str.isspace() 
df_filtered = df_filtered.loc[ m2 == False].reset_index(drop=True) 
del m2
m3 = df_filtered['user_message'].astype(str).apply(lambda x: detect(x) if len(x) >= 5 else '').eq('en')
df_filtered = df_filtered.loc[m3].reset_index(drop=True)

问题是我有超过 1200 万行。我听说对于这种类型的操作,使用 SQL 数据库会更有效,但我对 SQL 几乎一无所知。是否存在加快流程的解决方案?我尝试了 modin,但它不是决定性的。

谢谢!

标签: pythonpandas

解决方案


你能试试这个吗?将and采取行动,short circuit evaluation并且将在一次迭代中检查这两个条件。

import pandas as pd
from langdetect import detect #pip install langdetect

def cusom_detect(x):
    try:
        return detect(x)=='en'
    except:
        return False

df_out = df[df['user_message'].apply(lambda x: (len(x.split(' ')) >= 5) and cusom_detect(x))]
df_out.to_csv('output.csv')

使用pandarallel@https ://github.com/nalepae/pandarallel

import pandas as pd
from langdetect import detect #pip install langdetect
from pandarallel import pandarallel #pip install pandarallel

pandarallel.initialize()

def cusom_detect(x):
    try:
        return detect(x)=='en'
    except:
        return False

df_out = df[df['user_message'].parallel_apply(lambda x: (len(x.split(' ')) >= 5) and cusom_detect(x))]
df_out.to_csv('output.csv')

推荐阅读