Увеличивайте индекс строки в цикле, пока не будут обработаны все строки в фрейме данных — python

#python #dataframe #indexing #row #increment

#python #фрейм данных #индексирование #строка #увеличивайте

Вопрос:

Я читаю несколько строк за раз из фрейма данных, чтобы обработать около 1,3 млн строк для классификации текста. Я вручную обновляю количество строк, которые должны быть прочитаны и обработаны, используя df.iloc[from_row:to_row]

Я использую Colab для текущего действия. У меня есть отдельные блоки кодов, которые я использую в качестве потока для окончательной загрузки классифицированного фрейма данных с нарезанными строками.

Хотелось бы автоматически увеличивать числа from_row:to_row на 100 или 500 или 1000 после загрузки обработанного фрейма данных после каждого приращения, пока не будет обработана последняя строка

 temp = temp.iloc[100:201] ##Manually updating this part and running rest of the code

test=[]

**# classifiying sentences in text column**
for row in tqdm(temp['comments'].values):
  res = label_classify(row)
  test.append(res)
temp['test'] = test

**# mapping right labels to appropriate rows**
list_of_rows = temp.test.to_list()
th = 0.4    #whatever threshold value you want
result = list(map(lambda x: get_label_score_dict(x, th), list_of_rows))
result_df = pd.DataFrame(result)

**## concatenating labeled df to original df and downloading (to avoid losing processed data incase Colab reconnects or I lose the session)**
*# Merging dfs*
temp.reset_index(drop=True, inplace=True)
concatenated_df_new = pd.concat( [temp, result_df], axis=1)
merge_df = pd.DataFrame()
merge_df = pd.concat([merge_df,concatenated_df_new], axis=0, ignore_index=True)

**# downloading final dataframe**

from google.colab import files
merge_df.to_csv('merge_nps.csv') 
files.download('merge_nps.csv')
  

Для этого может быть совершенно другой способ. Я кодирую на python только в течение более короткого времени.

любая помощь или идеи о том, как я могу записать это как функцию или как увеличить счетчик (df.iloc[from_row:to_row]), были бы полезны.

Комментарии:

1. Я не понимаю, почему вы не можете поместить df.iloc[:] …?

2. @N.JonasFigge не могли бы вы уточнить. не понял вашего предложения

3. Обычно вы можете использовать : для получения всех элементов — я не понимаю, почему вы должны делать это последовательно…

4. @N.JonasFigge Мне пришлось бы обработать 1,3 млн строк, а расчетное время обработки всех строк в Colab составляет около 17 часов с использованием метода .apply(лямбда-строка: label_classify(строка)). Итак, я пытаюсь загружать свои обработанные выходные данные для каждой итерации, чтобы избежать потери обработанных данных в случае закрытия моего сеанса.

Ответ №1:

Если вы хотите выполнить какую-то пакетную обработку, вы можете использовать это:

 import numpy as np

batch_size = 1024   # or whatever you want the batch size to be
num_samples = 1.3e6 # or whatever the exact value is

num_batches = int(np.ceil(num_samples / batch_size))
for i in range(num_batches):
    temp = temp.iloc[i*batch_size : (i 1)*batch_size]

    #... rest of the code
  

Непроверенный, но вы поняли идею.