我正在尝试将一些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()