将条件值分配给Dask中的列

时间:2018-05-09 10:34:27

标签: dataframe dask

我正在尝试对特定列的行进行条件分配:target。我做了一些研究,似乎答案在这里给出:"How to do row processing and item assignment in 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(binaryze 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 

我们可以看到,targetmock中的列result不是预期的结果。似乎我的代码将所有0个原始值转换为1,而不是将大于0的值转换为1(条件规则)。

Dask newbie here,在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

好的,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

预期的输出是什么。

答案 1 :(得分:0)

他们似乎和我一样

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