将 dask QuantileTransformer 应用于同一数据框中的计算字段

Apply dask QuantileTransformer to a calculated field in the same dataframe

我正在尝试将 dask-ml QuantileTransformer 转换应用于 percentage 字段,并在同一数据框中创建一个新字段 percentage_qt。但是我收到错误 Array assignment only supports 1-D arrays。如何实现?

import pandas as pd
import dask.dataframe as dd
from dask_ml.preprocessing import QuantileTransformer

mydict = [{'percentage': 12.1, 'b': 2, 'c': 3, 'd': 4},
      {'percentage': 10.2, 'b': 200, 'c': 300, 'd': 400},
      {'percentage': 11.3, 'b': 2000, 'c': 3000, 'd': 4000 }]
df = pd.DataFrame(mydict)
ddf = dd.from_pandas(df, npartitions=10)

qt = QuantileTransformer(n_quantiles=100)
x = ddf[['percentage']]
y = qt.fit_transform(x)
ddf['percentage_qt'] = y # <-- error happens here

你得到的错误如下

ValueError: Array assignment only supports 1-D arrays

A y 不是数组。你可以使用这个技巧

使用与 ddf

相同的索引将 y 转换为 dask 数据帧
dfy = y.to_dask_dataframe(
    columns=['percentage_qt'],
    index=ddf.index)

由于某些奇怪的原因,0 轴上的连接不起作用(也许我们应该在 GH 上打开一个问题)所以我们可以将两个数据帧连接为

ddf_out = ddf.join(dfy)

哪个returns预期输出

print(ddf_out.compute())
   percentage     b     c     d  percentage_qt
0        12.1     2     3     4       1.000000
1        10.2   200   300   400       0.000000
2        11.3  2000  3000  4000       0.656772