【问题标题】:Assigning to dask series using positional indexing使用位置索引分配给 dask 系列
【发布时间】:2020-01-03 04:52:25
【问题描述】:

我有两个 DataFrame,df1 和 df2,它们共享一个索引。我想根据 df2 中的值分配 df1 中的值。

标准的 pandas 代码如下所示:

df1['column1'][df2['column2']==i] = j 

当在所有输入上运行时,这会正确填充 df1。

但是,dask DataFrames 上的相同语法会返回错误:

TypeError: 'Series' 对象不支持项目分配

dd.where()dd.mask() 似乎不起作用,因为它们也返回原始值。

是否有与上述熊猫代码等效的dask?

【问题讨论】:

  • 您介意提供mcve吗?特别是输入和预期输出。

标签: python pandas dask


【解决方案1】:

要完成你的任务,你应该:

  • 使用掩码获取新列,
  • 将其保存回column1

为了测试,我使用了以下源 DataFrame:

df1:

   column1  xxx
0        1  230
1        2  160
2        3  160
3        4  190
4        5  190
5        6  260
6        7  260
7        8  260
8        9  300

df2:

   column2  yyy
0       11  402
1       12  349
2       13  336
3       14  369
4       15  402
5       16  209
6       17  492
7       18  455
8       19  387

然后我设置变量:

i = 15
j = 100

我创建了两个 Dask DataFrame,如下所示:

dd1 = dd.from_pandas(df1, chunksize=5)
dd2 = dd.from_pandas(df2, chunksize=5)

为了进行实际处理,我运行了:

dd1.column1 = dd1.column1.mask(dd2['column2'] == i, j)
result = dd1.compute()

结果是:

   column1  xxx
0        1  230
1        2  160
2        3  160
3        4  190
4      100  190
5        6  260
6        7  260
7        8  260
8        9  300

因此,df1.column1 中索引 == 4 的值(其中 df2.column2 == 15 (i )) 已设置为 100 (j)。

【讨论】:

    【解决方案2】:

    我相信您正在寻找 dask.dataframe.Series.where 方法。对我来说似乎没问题。

    https://docs.dask.org/en/latest/dataframe-api.html#dask.dataframe.Series.where

    In [1]: import pandas as pd                                                     
    
    In [2]: import dask.dataframe as dd                                             
    
    In [3]: s = pd.Series(range(5))                                                 
    
    In [4]: ds = dd.from_pandas(s, npartitions=2)                                   
    
    In [5]: ds.where(ds > 1, 10).compute()                                          
    Out[5]: 
    0    10
    1    10
    2     2
    3     3
    4     4
    dtype: int64
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      • 2023-01-20
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 2022-11-13
      • 2021-05-23
      相关资源
      最近更新 更多