2016-08-18 3 views
2

У меня есть dataframe вроде этого:граф вхождений определенных значений в dask.dataframe

df.head() 
    day  time resource_record 
0 27 00:00:00    AAAA 
1 27 00:00:00    A 
2 27 00:00:00    AAAA 
3 27 00:00:01    A 
4 27 00:00:02    A 

и хотите узнать, как существует много вхождений определенного resource_records.

Моя первая попытка была с помощью серии возвращенное value_counts(), что кажется большим, но не позволяет мне, чтобы исключить некоторые ярлыки впоследствии, потому что нет drop() реализован в dask.Series.

Так что я попытался просто не печатать нежелательные этикетки:

for row in df.resource_record.value_counts().iteritems(): 
    if row[0] in ['AAAA']: 
     continue 
    print('\t{0}\t{1}'.format(row[1], row[0])) 

Который работает хорошо, но что, если я когда-либо хочу, чтобы продолжить работу над этими данными и действительно хотите это очищено. Так что я искал документацию немного больше и нашел mask(), но это чувствует себя немного неуклюжим, а также:

records = df.resource_record.mask(df.resource_record.map(lambda x: x in ['AAAA'])).value_counts() 

Я искал способ, который позволил бы мне просто рассчитывать отдельные значения, но count() делает подсчитывать все значения, не являются NaN.

Тогда я нашел str.contains(), но я не знаю, как обращаться с незадокументированным Скалярным типом я получаю возвращенный с этим кодом:

print(df.resource_record.str.contains('A').sum()) 

Выход:

dd.Scalar<series-..., dtype=int64> 

Но даже после того, как смотреть на Код Scalar в dask/dataframe/core.py Я не нашел способ получить его значение.

Как бы вы эффективно подсчитали появление определенного набора значений в вашем фреймворке?

+0

Выяснив это, я понял, что 'dask.dataframe.drop' поддерживает только ось = 1. Выброс на фреймворке данных мог быть решением. – vollkorn

+0

Чтобы получить значение Scalar (или любой другой коллекции dasky), вам нужен метод '.compute()'. – mdurant

+0

А, спасибо, я наткнулся на '.compute()' раньше, но не получил из документации, что это мне поможет. – vollkorn

ответ

2

В большинстве случаев синтаксис pandas будет работать также с dask, с необходимым добавлением .compute() (или dask.compute) для фактического выполнения действия. До вычисления вы просто строите график, определяющий действие.

Я считаю, что самое простым решение на ваш вопрос заключается в следующем:

df[df.resource_record!='AAAA'].resource_record.value_counts().compute() 

Где выражение в селекторных квадратных скобках может быть некоторое отображение или функция.

+0

Маленькая опечатка с символом ')' внутри '[]'. – vollkorn

+0

Это работает красиво. Наверное, я просто не очень разбираюсь в том, как делать вещи с пандами/дасками. Благодарю. – vollkorn

1

Один довольно хороший метод, который я нашел это:

counts = df.resource_record.mask(df.resource_record.isin(['AAAA'])).dropna().value_counts() 

Сначала мы маскировать все записи, мы хотели бы, чтобы удалить, который заменяет значение с NaN. Затем мы отбрасываем все строки с NaN и в последний раз подсчитываем вхождения уникальных значений.

Для этого требуется df, чтобы не иметь значений NaN, что в противном случае приводит к удалению строки, содержащей NaN.

Я ожидал что-то вроде

df.resource_record.drop(df.resource_record.isin(['AAAA'])) 

будет быстрее, потому что я считаю падение будет один раз пробежать набор данных, в то время как маска + dropna проходит через набор данных дважды. Но падение применяется только для оси = 1, и здесь нам нужна ось = 0.