python - 使用 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,但它不是决定性的。
谢谢!
解决方案
你能试试这个吗?将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')
推荐阅读
- sql - 我如何知道存储在 SQL 文件组数据/行中的内容?
- arrays - 更新状态后 Redux match.params 不起作用
- azure - 两条管道,单个 zip 文件
- android - 列不滚动到焦点上的 TextField
- reactjs - 如何在反应组件中有条件地渲染加载器微调器?
- postgresql - 如何从 postgres 中获取时间戳值?
- django - ElephantSQL 和 Django 不能一起工作,认证失败
- javascript - Javascript 中的自适应年份
- angular - Angular11 响应式表单更改验证以检查重复值
- mongodb - 如何在 Docker 中使用参数 EnableMongoDbEndpoint=3.6 启动 azure-cosmosdb-emulator