У меня есть pandas фрейм данных с примерно 16 миллионами строк. Я хотел бы определить язык для каждой строки на основе столбца df["text"]
. Тем не менее, это действительно медленно и займет около дня до конца sh. Я попробовал .map()
вместо .apply()
, но это не привело к значительному увеличению скорости.
Я попытался сделать .loc(df.loc[isEn(df["lang"]) == "en"])
, но это также не сработало, потому что не вернулось последовательность, но единственное логическое значение.
Я также пытался использовать swifter для распараллеливания, но он все еще очень медленный.
import pandas
from numpy import datetime64
from langdetect import detect
import swifter
iterator = 0
def isEn(x):
global iterator
global total
iterator+=1
print(str(iterator)+" / "+str(total))
try:
return detect(str(x))
except:
return "na"
fields = ['timestamp', 'text']
parse_dates = ['timestamp']
df = pandas.read_csv('../../../data/twitter/tweets_truncated.csv', dtype={"timestamp": str, "text": str},
usecols=fields, sep=';', parse_dates=parse_dates)
df = df["2016-03-05" < df["timestamp"]]
df.set_index(["timestamp"], inplace = True)
df = df.sort_index()
df = df[15 < df['text'].str.len()]
a = df.values
print(df.head())
print(df.tail())
total = len(df.index)
df["lang"] = df["text"].swifter.apply(lambda x : isEn(str(x)))
df2 = df.loc[df["lang"] == "en"]
df2.to_csv('../../../data/twitter/tweets_truncated_english.csv', sep=';')