Dask + Pandas:返回一系列条件虚拟对象
Dask + Pandas: Returning a sequence of conditional dummies
在 Pandas 中,如果我想创建一列条件虚拟变量(如果变量等于字符串则为 1,否则为 0),那么我在 pandas 中的转到是:
data["ebt_dummy"] = np.where((data["paymenttypeid"]=='ebt'), 1, 0)
天真地在 dask 数据帧中尝试此操作会引发错误。遵循 map_partitions 文档中的说明也会引发错误:
data = data.map_partitions(lambda df: df.assign(ebt_dummy = np.where((df["paymenttypeid"]=='ebt'), 1, 0)), meta={'paymenttypeid': 'str', 'ebt_dummy': 'i8'})
执行此操作的好方法或最 Dask-thonic 方法是什么?
这里有一些示例数据可供使用:
In [1]:
df = pd.DataFrame(np.transpose([np.random.choice(['ebt','other'], (10)),
np.random.rand(10)]), columns=['paymenttypeid','other'])
df
Out[1]:
paymenttypeid other
0 other 0.3130770966143612
1 other 0.5167434068096931
2 ebt 0.7606898392115471
3 ebt 0.9424572692382547
4 ebt 0.624282017575857
5 ebt 0.8584841824784487
6 other 0.5017083765654611
7 other 0.025994123211164233
8 ebt 0.07045354449612984
9 ebt 0.11976351556850084
让我们将其转换为数据帧
In [2]: data = dd.from_pandas(df, npartitions=2)
并使用apply
(在系列上)分配:
In [3]:
data['ebt_dummy'] = data.paymenttypeid.apply(lambda x: 1 if x =='ebt' else 0, meta=('paymenttypeid', 'str'))
data.compute()
Out [3]:
paymenttypeid other ebt_dummy
0 other 0.3130770966143612 0
1 other 0.5167434068096931 0
2 ebt 0.7606898392115471 1
3 ebt 0.9424572692382547 1
4 ebt 0.624282017575857 1
5 ebt 0.8584841824784487 1
6 other 0.5017083765654611 0
7 other 0.025994123211164233 0
8 ebt 0.07045354449612984 1
9 ebt 0.11976351556850084 1
更新:
看来你传递的 meta
是问题所在,因为这个有效:
data = data.map_partitions(lambda df: df.assign(
ebt_dummy = np.where((df["paymenttypeid"]=='ebt'), 1, 0)))
data.compute()
在我的示例中,如果我想指定 meta
,我将必须传递当前 data
的数据类型,而不是我分配后期望的数据类型:
data.map_partitions(lambda df: df.assign(
ebt_dummy = np.where((df["paymenttypeid"]=='ebt'), 1, 0)),
meta={'paymenttypeid': 'str', 'other': 'float64'})
这对我也有用:
data['ebt_dummy'] = dd.from_array(np.where((df["paymenttypeid"]=='ebt'), 1, 0))
在 Pandas 中,如果我想创建一列条件虚拟变量(如果变量等于字符串则为 1,否则为 0),那么我在 pandas 中的转到是:
data["ebt_dummy"] = np.where((data["paymenttypeid"]=='ebt'), 1, 0)
天真地在 dask 数据帧中尝试此操作会引发错误。遵循 map_partitions 文档中的说明也会引发错误:
data = data.map_partitions(lambda df: df.assign(ebt_dummy = np.where((df["paymenttypeid"]=='ebt'), 1, 0)), meta={'paymenttypeid': 'str', 'ebt_dummy': 'i8'})
执行此操作的好方法或最 Dask-thonic 方法是什么?
这里有一些示例数据可供使用:
In [1]:
df = pd.DataFrame(np.transpose([np.random.choice(['ebt','other'], (10)),
np.random.rand(10)]), columns=['paymenttypeid','other'])
df
Out[1]:
paymenttypeid other
0 other 0.3130770966143612
1 other 0.5167434068096931
2 ebt 0.7606898392115471
3 ebt 0.9424572692382547
4 ebt 0.624282017575857
5 ebt 0.8584841824784487
6 other 0.5017083765654611
7 other 0.025994123211164233
8 ebt 0.07045354449612984
9 ebt 0.11976351556850084
让我们将其转换为数据帧
In [2]: data = dd.from_pandas(df, npartitions=2)
并使用apply
(在系列上)分配:
In [3]:
data['ebt_dummy'] = data.paymenttypeid.apply(lambda x: 1 if x =='ebt' else 0, meta=('paymenttypeid', 'str'))
data.compute()
Out [3]:
paymenttypeid other ebt_dummy
0 other 0.3130770966143612 0
1 other 0.5167434068096931 0
2 ebt 0.7606898392115471 1
3 ebt 0.9424572692382547 1
4 ebt 0.624282017575857 1
5 ebt 0.8584841824784487 1
6 other 0.5017083765654611 0
7 other 0.025994123211164233 0
8 ebt 0.07045354449612984 1
9 ebt 0.11976351556850084 1
更新:
看来你传递的 meta
是问题所在,因为这个有效:
data = data.map_partitions(lambda df: df.assign(
ebt_dummy = np.where((df["paymenttypeid"]=='ebt'), 1, 0)))
data.compute()
在我的示例中,如果我想指定 meta
,我将必须传递当前 data
的数据类型,而不是我分配后期望的数据类型:
data.map_partitions(lambda df: df.assign(
ebt_dummy = np.where((df["paymenttypeid"]=='ebt'), 1, 0)),
meta={'paymenttypeid': 'str', 'other': 'float64'})
这对我也有用:
data['ebt_dummy'] = dd.from_array(np.where((df["paymenttypeid"]=='ebt'), 1, 0))