如何使用 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
,我可以使用创建一个包含 List
的 Lists
列,如下所示:
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()
我正在尝试将一些 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
,我可以使用创建一个包含 List
的 Lists
列,如下所示:
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()