如何使用 Dask Dataframe 使用其他列的值生成数组列

How to generate array column with values from other columns using Dask Dataframe

我正在尝试将一些 Pandas 代码转换为 Dask。

我有一个如下所示的数据框:

   ListView_Lead_MyUnreadLeads  ListView_Lead_ViewCustom2 
0                            1                          1   
1                            1                          0   
2                            1                          1   
3                            1                          1   
4                            1                          1   

在 Pandas 中,如果行值为 1,我可以使用创建一个包含 ListLists 列,如下所示:

df['Lists'] = df.dot(df.columns+",").str.rstrip(",").str.split(",")

所以 Lists 列看起来像:

                                               Lists
0  [ListView_Lead_MyUnreadLeads, ListView_Lead_Vi...
1                      [ListView_Lead_MyUnreadLeads]
2  [ListView_Lead_MyUnreadLeads, ListView_Lead_Vi...
3  [ListView_Lead_MyUnreadLeads, ListView_Lead_Vi...
4  [ListView_Lead_MyUnreadLeads, ListView_Lead_Vi...

在 Dask 中,dot 函数的工作方式似乎不同。我怎样才能获得相同的行为/输出?

如有任何帮助,我们将不胜感激。谢谢!

Pandas中的相关问题:

Pandas 中提供了一些替代方法。你可以试试在Dask中是否同样有效。

cols = df.columns.values
df['Lists'] = [list(cols[x]) for x in df.eq(1).values]

或尝试:

df['Lists'] = df.eq(1).apply(lambda x: list(x.index[x]), axis=1)

如果您的数据集很大,使用列表理解的第一个解决方案可提供更好的性能。

结果:

print(df)

   ListView_Lead_MyUnreadLeads  ListView_Lead_ViewCustom2                                                     Lists
0                            1                          1  [ListView_Lead_MyUnreadLeads, ListView_Lead_ViewCustom2]
1                            1                          0                             [ListView_Lead_MyUnreadLeads]
2                            1                          1  [ListView_Lead_MyUnreadLeads, ListView_Lead_ViewCustom2]
3                            1                          1  [ListView_Lead_MyUnreadLeads, ListView_Lead_ViewCustom2]
4                            1                          1  [ListView_Lead_MyUnreadLeads, ListView_Lead_ViewCustom2]

这是一个带有 map_partitions 的 Dask 版本:

import pandas as pd
import dask.dataframe as dd

df = pd.DataFrame({'ListView_Lead_MyUnreadLeads': [1,1,1,1,1], 'ListView_Lead_ViewCustom2': [1,0,1,1,1] })

ddf = dd.from_pandas(df, npartitions=2)

def myfunc(df):
    df = df.copy()
    df['Lists'] = df.dot(df.columns+",").str.rstrip(",").str.split(",")
    return df

ddf.map_partitions(myfunc).compute()