【问题标题】:Dask get_dummies Does Not Transform Variable(s)Dask get_dummies 不转换变量
【发布时间】:2017-06-10 19:18:37
【问题描述】:

我正在尝试通过dask 使用get_dummies,但它不会转换我的变量,也不会出错:

>>> import dask.dataframe as dd
>>> import pandas as pd
>>> df_d = dd.read_csv('/datasets/dask_example/dask_get_dummies_example.csv')
>>> df_d.head()
   uid gender
0    1      M
1    2    NaN
2    3    NaN
3    4      F
4    5    NaN
>>> daskDataCategorical = df_d[['gender']]
>>> daskDataDummies = dd.get_dummies(daskDataCategorical) 
>>> daskDataDummies.head()
  gender
0      M
1    NaN
2    NaN
3      F
4    NaN
>>> daskDataDummies.compute() 
  gender
0      M
1    NaN
2    NaN
3      F
4    NaN
5      F
6      M
7      F
8      M
9      F
>>>

pandas 等价(在新终端中运行以防万一)是:

>>> import pandas as pd
>>> df_p = pd.read_csv('/datasets/dask_example/dask_get_dummies_example.csv')
>>> df_p.head()
   uid gender
0    1      M
1    2    NaN
2    3    NaN
3    4      F
4    5    NaN
>>> pandasDataCategorical = df_p[['gender']]
>>> pandasDataDummies = pd.get_dummies(pandasDataCategorical)
>>> pandasDataDummies.head()
   gender_F  gender_M
0       0.0       1.0
1       0.0       0.0
2       0.0       0.0
3       1.0       0.0
4       0.0       0.0
>>> 

我对@9​​87654321@的理解是应该可以,但是需要先拉到pandas吗?如果是这样,它就违背了我使用它的目的,因为我的数据集(~500GB)不适合pandas 数据框。我误读了这个吗? TIA。

【问题讨论】:

  • 选择列不需要列表:df_d[['gender']] -->df_d['gender']
  • 真实例子(现有代码)是200+变量

标签: python pandas dask dummy-variable


【解决方案1】:

在尝试使用get_dummies 之前,您需要将字符串列转换为CategoricalThis pull request 添加了一个dask.dataframe.get_dummies,如果您尝试传递object(字符串)列,将会出错,这与pd.get_dummies 不同。

要获得Categorical,您可以在dd.get_dummies 之前使用.categorize,或者使用pandas >= 0.19,在您的CSV 中使用dtype 关键字类似的读取

df_d = dd.read_csv('/datasets/dask_example/dask_get_dummies_example.csv', dtype={"gender": "category"})

这是一个小例子:

In [2]: import dask.dataframe as dd

In [3]: bad = dd.from_pandas(pd.DataFrame({"A": ['a', 'b', 'a', 'b', 'c']}), npartitions=2)

In [4]: bad.head()
/Users/tom.augspurger/Envs/py3/lib/python3.6/site-packages/dask/dask/dataframe/core.py:3699: UserWarning: Insufficient elements for `head`. 5 elements requested, only 3 elements available. Try passing larger `npartitions` to `head`.
  warnings.warn(msg.format(n, len(r)))
Out[4]:
   A
0  a
1  b
2  a

In [5]: dd.get_dummies(bad)
---------------------------------------------------------------------------
NotImplementedError                       Traceback (most recent call last)
<ipython-input-5-651de6dd308c> in <module>()
----> 1 dd.get_dummies(bad)

/Users/tom.augspurger/Envs/py3/lib/python3.6/site-packages/dask/dask/dataframe/reshape.py in get_dummies(data, prefix, prefix_sep, dummy_na, columns, sparse, drop_first)
     68         if columns is None:
     69             if (data.dtypes == 'object').any():
---> 70                 raise NotImplementedError(not_cat_msg)
     71             columns = data._meta.select_dtypes(include=['category']).columns
     72         else:

NotImplementedError: `get_dummies` with non-categorical dtypes is not supported. Please use `df.categorize()` beforehand to convert to categorical dtype.

In [7]: dd.get_dummies(bad.categorize()).compute()
Out[7]:
   A_a  A_b  A_c
0    1    0    0
1    0    1    0
2    1    0    0
3    0    1    0
4    0    0    1

Dask 需要 get_dummies 的分类,因为它需要知道它需要创建的所有新虚拟变量。 pandas 不必担心这一点,因为您的所有数据都已在内存中。

【讨论】:

  • 嗨,汤姆,感谢您的回复,这是有道理的。虽然您的示例有效,但将 .categorize() 添加到我的示例中给了我: Traceback (most recent call last): File "", line 1, in AttributeError: 'Series' object has no attribute 'categorize'
  • 你应该可以dd.get_dummies(data.to_frame().categorize())
  • 对不起,这给了我这个错误:raise AttributeError("'DataFrame' object has no attribute %r" % key) AttributeError: 'DataFrame' object has no attribute 'to_frame'
  • 你确定你在两个地方运行相同的代码吗?您的第一条评论有问题,因为您有一个系列而不是 DataFrame;您的第二条评论有问题,因为您已经有一个数据框。
猜你喜欢
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
相关资源
最近更新 更多