Как читать данные в dask dataframe и удалять плохие строки - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь объединить большую (66 ГБ) базу данных с несколькими строками неверных данных, используя dask.

Поскольку в dask нет функции удаления неисправных строк, я сначала читаю все данные как pandas фрейм данных и удаление плохих линий. Я тогда преобразовываю это в dask dataframe. Мой код выглядит следующим образом:

import dask.dataframe как dd import pandas as pd из dask.distributed import Client

#Groups the average Thresholds by NEATGeneration and finds the mean, standard deviation, minimum and maximum of the data
def group(df):
    res = df.groupby(df["NEATGeneration"]).agg({'averageThreshold': ['mean', 'std','max','min']}).compute()
    return res


if __name__ == '__main__':

   Client(n_workers=4, threads_per_worker=6,memory_limit='120GB')

   #Loads in the data as a pandas datframe inlcuding bad lines
   df = dd.read_csv("agentsvfitness.txt",error_bad_lines=False,usecols=["NEATGeneration","averageThreshold"])

   #Replaces elements in  the averageThreshold column that are not numeric with NA
   pd.to_numeric(df['averageThreshold'] , errors ='coerce') 

   #Removes rows with NA
   df = df.dropna()

   #runs the group() function in parallel
   df = group(df)

   #Sets all column names and prepares data for writing to csv
   df.columns = ['mean', 'std','max','min']

   #Writes aggregated data to a single csv file
   df.to_csv("averageThreshold.csv")

Проблема, с которой я сталкиваюсь, заключается в том, что данные имеют было неправильно записано следующим образом (выделено жирным шрифтом):

NEATПроизводство, средняяФитнесность, средняяРесурсыСообщено, среднееПороговое значение

0,8.32,0.8533333333333334,0.4819999999999999

0,8.486666666666666,1.7266666666666666.47333333333333333 #lacking ", 0"

0,8.0533333333333331.8466666666666667,0.4500000000000001 * ослабления "10," * 1022 1024 * 0,8.306666666666667,1.9466666666666668,0.44933131583851454

Мой текущий метод не может удалить эти строки при чтении данных в фрейме данных dask. Есть ли способ удалить эти плохие строки из уже существующего кадра данных? Иначе есть ли способ считывать только «хорошие» данные (данные с правильным количеством точек данных)? Я работаю в кластере с 24 процессорами и 120 ГБ памяти.

1 Ответ

0 голосов
/ 23 февраля 2020

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

Вы можете использовать Dask Bag для чтения строк текста как текста, а не Pandas Dataframes. Затем вы можете отфильтровать плохие строки с помощью функции Python (возможно, подсчитав количество запятых или что-то в этом роде), а затем вы можете записать это обратно в текстовые файлы, а затем перечитать с помощью Dask Dataframe теперь, когда данные являются немного более очищен. Возможно, есть также хороший способ превратить Dask Bag в Dask Dataframe без записи промежуточных файлов на диск, но это, вероятно, немного сложнее.

...