Я ищу способ удалить строки из кадра данных, которые содержат низкочастотные элементы.Я адаптировал следующий фрагмент из этого сообщения:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0, high=9, size=(100,2)),
columns = ['A', 'B'])
threshold = 10 # Anything that occurs less than this will be removed.
value_counts = df.stack().value_counts() # Entire DataFrame
to_remove = value_counts[value_counts <= threshold].index
df.replace(to_remove, np.nan, inplace=True)
Проблема в том, что этот код не масштабируется, кажется.
Строка to_remove = value_counts[value_counts <= threshold].index
имееттеперь я работаю в течение нескольких часов (2 ГБ сжатого хранилища HDFS).Поэтому мне нужно лучшее решение.Идеально вне ядра.Я подозреваю, что dask.dataframe
подходит, но я не могу выразить приведенный выше код в терминах dask.Функции клавиш stack
и replace
отсутствуют в dask.dataframe
.
Я попробовал следующее (работает в обычных пандах), чтобы обойти отсутствие этих двух функций:
value_countss = [df[col].value_counts() for col in df.columns]
infrequent_itemss = [value_counts[value_counts < 3] for value_counts in value_countss]
rows_to_drop = set(i for indices in [df.loc[df[col].isin(infrequent_items.keys())].index.values for col, infrequent_items in zip(df.columns, infrequent_itemss)] for i in indices)
df.drop(rows_to_drop)
Это на самом деле не работает с Dask, хотя.Это ошибки в infrequent_items.keys()
.
Даже если это сработало, учитывая, что это противоположно элегантному, я подозреваю, что должен быть лучший способ.
Можете ли вы что-то предложить?