我正在尝试对特定列的行进行条件分配: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
我们可以看到,target
和mock
中的列result
不是预期的结果。似乎我的代码将所有0个原始值转换为1,而不是将大于0的值转换为1(条件规则)。
Dask newbie here,在此先感谢您的帮助。
答案 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