Назначить условные значения столбцам в Dask - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь сделать условное присвоение строкам определенного столбца: target. Я провел некоторое исследование, и мне показалось, что ответ был дан здесь: «Как выполнять обработку строк и назначение элементов в dask» .

Я воспроизведу мою необходимость. Макет данных:

x = [3, 0, 3, 4, 0, 0, 0, 2, 0, 0, 0, 6, 9]
y = [200, 300, 400, 215, 219, 360, 280, 396, 145, 276, 190, 554, 355]
mock = pd.DataFrame(dict(target = x, speed = y))

Внешний вид mock:

In [4]: mock.head(7)
Out [4]:
      speed target
    0   200 3
    1   300 0
    2   400 3
    3   215 4
    4   219 0
    5   360 0
    6   280 0

Имея это Pandas DataFrame, я превращаю его в Dask DataFrame:

mock_dask = dd.from_pandas(mock, npartitions = 2)

Я применяю свое условное правило: все значения в target выше 0, должны быть 1, все остальные 0 (бинарное target). Следуя вышеупомянутой теме, оно должно быть:

result = mock_dask.target.where(mock_dask.target > 0, 1)

Я смотрю на набор данных результата, и он не работает должным образом:

In [7]: result.head(7)
Out [7]:
0    3
1    1
2    3
3    4
4    1
5    1
6    1
Name: target, dtype: object 

Как мы видим, столбцы target в mock и result не являются ожидаемыми результатами. Кажется, что мой код преобразовывает все 0 исходных значений в 1 вместо значений, которые больше 0 в 1 (условное правило).

Даск, новичок здесь, заранее спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

ОК, документация в Dask DataFrame API довольно понятна. Благодаря обратной связи @MRocklin я осознал свою ошибку. В документации используется функция where (последняя в списке) со следующим синтаксисом:

DataFrame.where(cond[, other])      Return an object of same shape as self and whose corresponding entries are from self where cond is True and otherwise are from other.

Таким образом, правильная строка кода будет:

result = mock_dask.target.where(mock_dask.target <= 0, 1) 

Будет выведено:

In [7]: result.head(7)
Out [7]:
0    1
1    0
2    1
3    1
4    0
5    0
6    0
Name: target, dtype: int64

Какой ожидаемый результат.

0 голосов
/ 09 мая 2018

Они кажутся мне одинаковыми

In [1]: import pandas as pd

In [2]: x = [1, 0, 1, 1, 0, 0, 0, 2, 0, 0, 0, 6, 9]
   ...: y = [200, 300, 400, 215, 219, 360, 280, 396, 145, 276, 190, 554, 355]
   ...: mock = pd.DataFrame(dict(target = x, speed = y))
   ...: 

In [3]: import dask.dataframe as dd

In [4]: mock_dask = dd.from_pandas(mock, npartitions = 2)

In [5]: mock.target.where(mock.target > 0, 1).head(5)
Out[5]: 
0    1
1    1
2    1
3    1
4    1
Name: target, dtype: int64

In [6]: mock_dask.target.where(mock_dask.target > 0, 1).head(5)
Out[6]: 
0    1
1    1
2    1
3    1
4    1
Name: target, dtype: int64
...