如何使用 Dask 对字符串使用函数?
How to use function for strings using Dask?
我有一个大数据集,最近被介绍到 Dask。我正在尝试标记每一行中的文本。
这在 pandas 中很容易做到,如下所示,但我有一个错误说
AttributeError: 'DataFrame' object has no attribute 'lower' when I try use Dask (see the second group of codes below)
import pandas as pd
import dask
import dask.dataframe as dd
def to_lower(text):
return text.lower()
df_2016 = pd.read_csv("2016_Cleaned_DroppedDup.csv")
df_2016['token2'] = df_2016['token2'].apply(lambda x: pr.to_lower(x))
使用 DASK:
df_2016 = dd.from_pandas(df_2016, npartitions = 4 * multiprocessing.cpu_count())
df_2016 = df.2016.map_partitions.(lambda df: df.apply(lambda x: pr.to_lower(x))).compute(scheduler = 'processes')
我建议将来提供创建数据框的代码,这样就没有人需要猜测您的数据实际是什么样的。但我认为这个案子很简单。另外,我认为您提供的代码中存在语法错误,例如 df.2016.map_partitions
应该是 df_2016.map_partitions
。此外,不清楚 pr
对象在您的代码中是什么。
鉴于这些错误,我只是在与您的设置类似的最小工作示例中使用 .str
方法重写了在 dask 和 pandas 中对字符串进行操作的操作。 pandas 和 dask 之间的语法差异很小。
编辑:添加了用户提供的函数(to_lower
)以在 dask 中使用 .apply
给出示例。
import pandas as pd
import dask.dataframe as dd
def to_lower(text):
return text.lower()
# using pandas
df_2016 = pd.DataFrame({'token2':['HI']*100 + ['YOU']*100})
df_2016['token2_low'] = df_2016['token2'].str.lower()
df_2016['token2_low_apply'] = df_2016['token2'].apply(to_lower)
df_2016
token2 token2_low token2_low_apply
0 HI hi hi
1 HI hi hi
2 HI hi hi
3 HI hi hi
4 HI hi hi
.. ... ... ...
195 YOU you you
196 YOU you you
197 YOU you you
198 YOU you you
199 YOU you you
[200 rows x 3 columns]
# using dask
ddf_2016 = dd.from_pandas(df_2016[['token2']], npartitions=10)
ddf_2016['token2_low'] = ddf_2016['token2'].str.lower()
ddf_2016['token2_low_apply'] = ddf_2016['token2'].apply(to_lower, meta=('token2', 'object'))
ddf_2016.compute()
token2 token2_low token2_low_apply
0 HI hi hi
1 HI hi hi
2 HI hi hi
3 HI hi hi
4 HI hi hi
.. ... ... ...
195 YOU you you
196 YOU you you
197 YOU you you
198 YOU you you
199 YOU you you
[200 rows x 3 columns]
我有一个大数据集,最近被介绍到 Dask。我正在尝试标记每一行中的文本。 这在 pandas 中很容易做到,如下所示,但我有一个错误说
AttributeError: 'DataFrame' object has no attribute 'lower' when I try use Dask (see the second group of codes below)
import pandas as pd
import dask
import dask.dataframe as dd
def to_lower(text):
return text.lower()
df_2016 = pd.read_csv("2016_Cleaned_DroppedDup.csv")
df_2016['token2'] = df_2016['token2'].apply(lambda x: pr.to_lower(x))
使用 DASK:
df_2016 = dd.from_pandas(df_2016, npartitions = 4 * multiprocessing.cpu_count())
df_2016 = df.2016.map_partitions.(lambda df: df.apply(lambda x: pr.to_lower(x))).compute(scheduler = 'processes')
我建议将来提供创建数据框的代码,这样就没有人需要猜测您的数据实际是什么样的。但我认为这个案子很简单。另外,我认为您提供的代码中存在语法错误,例如 df.2016.map_partitions
应该是 df_2016.map_partitions
。此外,不清楚 pr
对象在您的代码中是什么。
鉴于这些错误,我只是在与您的设置类似的最小工作示例中使用 .str
方法重写了在 dask 和 pandas 中对字符串进行操作的操作。 pandas 和 dask 之间的语法差异很小。
编辑:添加了用户提供的函数(to_lower
)以在 dask 中使用 .apply
给出示例。
import pandas as pd
import dask.dataframe as dd
def to_lower(text):
return text.lower()
# using pandas
df_2016 = pd.DataFrame({'token2':['HI']*100 + ['YOU']*100})
df_2016['token2_low'] = df_2016['token2'].str.lower()
df_2016['token2_low_apply'] = df_2016['token2'].apply(to_lower)
df_2016
token2 token2_low token2_low_apply
0 HI hi hi
1 HI hi hi
2 HI hi hi
3 HI hi hi
4 HI hi hi
.. ... ... ...
195 YOU you you
196 YOU you you
197 YOU you you
198 YOU you you
199 YOU you you
[200 rows x 3 columns]
# using dask
ddf_2016 = dd.from_pandas(df_2016[['token2']], npartitions=10)
ddf_2016['token2_low'] = ddf_2016['token2'].str.lower()
ddf_2016['token2_low_apply'] = ddf_2016['token2'].apply(to_lower, meta=('token2', 'object'))
ddf_2016.compute()
token2 token2_low token2_low_apply
0 HI hi hi
1 HI hi hi
2 HI hi hi
3 HI hi hi
4 HI hi hi
.. ... ... ...
195 YOU you you
196 YOU you you
197 YOU you you
198 YOU you you
199 YOU you you
[200 rows x 3 columns]