Как ускорить pandas dataframe .apply (), где функция вызывается для каждого элемента в столбце - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть 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=';')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...