如何使用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,我可以使用创建Lists列,其中包括List,如下所示:

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数据框架中每行标准的列标头?

以下是在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()

最新更新