Dask+Pandas:返回一系列条件假人

2024-09-27 23:26:28 发布

您现在位置:Python中文网/ 问答频道 /正文

在Pandas中,如果我想创建一列条件伪对象(如果变量等于字符串,则为1,否则为0),则Pandas中的goto为:

data["ebt_dummy"] = np.where((data["paymenttypeid"]=='ebt'), 1, 0)

在dask数据帧中天真地尝试此操作会引发错误。按照map_分区文档中的说明操作也会引发错误:

^{pr2}$

做这件事的好方法,或者说最卑鄙的方式是什么?在


Tags: 数据对象字符串mappandasdata错误np
2条回答

这对我也很有用:

data['ebt_dummy'] = dd.from_array(np.where((df["paymenttypeid"]=='ebt'), 1, 0))

以下是一些示例数据:

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

让我们把它转换成一个数据帧

^{pr2}$

并使用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'})

相关问题 更多 >

    热门问题