Pandas DataFrame со ста миллионами записей и подсчетом количества одинаковых символов в строкахPython

Программы на Python
Ответить
Anonymous
 Pandas DataFrame со ста миллионами записей и подсчетом количества одинаковых символов в строках

Сообщение Anonymous »

У меня есть pandas DataFrame () с двумя столбцами (а именно Tuple и Set) и примерно 100 000 000 записей. Данные столбца Tuple представляют собой строку длиной ровно 9 символов. Данные столбца Set представляют собой порядковое целое число от 0 примерно до 1000, которое присваивает кортеж соответствующему набору. Каждый набор содержит около 100 000 последовательных кортежей.
Теперь мне нужно пометить каждый кортеж (в новом столбце Label) как 1, если он содержит не менее 5 одинаковых символов, и 0 в противном случае.
Я пытаюсь найти способ сделать это, не тратя всю жизнь...
Моя первая наивная попытка (после импорта) Счетчик из коллекций) был

Код: Выделить всё

for j in tqdm(df.index):
cond = max(Counter(df[df.index==j].Tuple.values[0]).values()) >= 5
df.loc[df.index==j, "Label"] = int(cond)
но согласно tqdm, на моем MacBook Pro это заняло бы примерно 3350 часов (почти 5 месяцев, лол).
Итак, поскольку кортежи назначены наборам примерно из 100 000 записей, я решил пометить их в каждом отдельном наборе и потом собрать все обратно

Код: Выделить всё

dfs = []
for i in tqdm(df.Set.unique()):
_df = df[df.Set==i].copy(deep=True)
for j in tqdm(_df.index, leave=False):
cond = max(Counter(_df[_df.index==j].Tuple.values[0]).values()) >= 5
_df.loc[_df.index==j, "Label"] = int(cond)
dfs.append(_df)
По данным tqdm, это займет примерно 12 часов. Гораздо лучше, чем 5 месяцев, и вполне доступно! Но мне было интересно, есть ли более эффективный способ (возможно, какие-то полезные функции numpy или pandas, о которых я не знаю, и которые могли бы немного ускорить все).
Есть предложения?

Обновить
Как предложено, я предоставляю образец набора данных и импорт

Код: Выделить всё

from collections import Counter
import numpy as np
import pandas as pd
from tqdm.notebook import tqdm

n = int(1e4) # this will be ~1e8 in real cases
n_set = 10   # this will be ~1000 in real cases
df = pd.DataFrame({
"Tuple": np.random.randint(100000000, 1000000000, size=n).astype(str),
"Set": np.random.randint(n_set, size=n)
})
При n=int(1e8) это займет некоторое время.


Подробнее здесь: https://stackoverflow.com/questions/798 ... r-of-ident
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»