python - 如何在 dask 中映射函数
问题描述
我正在使用 Dask 来操作数据框(来自 CSV 文件),并且我正在寻找一种方法来使用类似map
, 或apply
函数来改进此代码,因为在大文件中需要很长时间(我知道嵌套for
和使用iterrows()
是最糟糕的是我能做到)
NAN_VALUES = [-999, "INVALID", -9999]
_all_rows=list()
for index, row in df.iterrows():
_row = list()
for key, value in row.iteritems():
if value in NAN_VALUES or pd.isnull(value):
_row.append(None)
else:
_row.append(apply_transform(key, value))
_all_rows.append(_row)
rows_count += 1
如何使用map_partitions
or映射此代码pandas.map
?!
额外:更多上下文:为了能够应用某些功能,我将 NaN 值替换为默认值。最后,我需要为每一行创建一个列表,将默认值替换为 None。
1.- 原始 DF
"name" "age" "money"
---------------------------
"David" NaN 12.345
"Jhon" 22 NaN
"Charles" 30 123.45
NaN NaN NaN
2.- 将 NaN 传递给默认值
"name" "age" "money"
------------------------------
"David" -999 12.345
"Jhon" 22 -9999
"Charles" 30 123.45
"INVALID" -999 -9999
3.- 将每一行解析为一个列表
"name" , "age", "money"
------------------------
["David", None, 12.345]
["Jhon", 22, None]
["Charles", 30, 123.45]
[None, None, None]
解决方案
我的建议是尝试使用 pandas,然后尝试翻译成 dask
pandas
import pandas as pd
import numpy as np
nan = np.nan
df = {'name': {0: 'David', 1: 'John', 2: 'Charles', 3: nan},
'age': {0: nan, 1: 22.0, 2: 30.0, 3: nan},
'money': {0: 12.345, 1: nan, 2: 123.45, 3: nan}}
df = pd.DataFrame(df)
# These are your default values
diz = {"age": -999, "name": "INVALID", "money": -9999}
将 NaN 传递给默认值
for k,v in diz.items():
df[k] = df[k].fillna(v)
获取每一行的列表
df.apply(list, axis=1)
0 [David, nan, 12.345]
1 [John, 22.0, nan]
2 [Charles, 30.0, 123.45]
3 [nan, nan, nan]
dtype: object
dask
import pandas as pd
import dask.dataframe as dd
import numpy as np
nan = np.nan
df = {'name': {0: 'David', 1: 'John', 2: 'Charles', 3: nan},
'age': {0: nan, 1: 22.0, 2: 30.0, 3: nan},
'money': {0: 12.345, 1: nan, 2: 123.45, 3: nan}}
df = pd.DataFrame(df)
# These are your default values
diz = {"age": -999, "name": "INVALID", "money": -9999}
# transform to dask dataframe
df = dd.from_pandas(df, npartitions=2)
将 NaN 传递给默认值
这和以前完全一样。请注意,dask
如果你想看到效果,你应该运行它是惰性的df.compute()
for k,v in diz.items():
df[k] = df[k].fillna(v)
获取每一行的列表
当您被要求明确说明输出的 dtype 时,这里的情况会发生一些变化
df.apply(list, axis=1, meta=(None, 'object'))
在 dask 你最终可以使用map_partitions
如下
df.map_partitions(lambda x: x.apply(list, axis=1))
备注请考虑如果您的数据适合您不需要的内存dask
并且pandas
可以更快。
推荐阅读
- javascript - redux-toolkit 中的异步调度
- python - 如何比较两个二进制文件或文件集并在 Python 中显示它们之间的差异?
- javascript - 地图功能不渲染元素
- javascript - Angular:路由器导航引发 JIT 编译失败
- c - 如何计算结构中数据成员的大小?
- c# - SSRSReport打印服务——无效的报表定义错误随机出现,重启服务后才能再次工作
- python - args[0]['valid'] 在装饰器中是什么意思
- mysql - 合并两个有另一个关系表的表
- c# - C#静默安装msi不起作用
- google-cloud-platform - 在 GCP-我如何获得所有价格的列表