我正在尝试将json文件加载到daf df中。
files = glob.glob('**/*.json', recursive=True)
df = dd.read_json(files, lines = False)
数据中缺少一些值,并且某些文件具有额外的列。 有没有一种方法可以指定列列表,因此所有可能的列都将存在于串联的daf df中? 另外,它不能处理缺失值吗?尝试计算df时出现以下错误:
ValueError: Metadata mismatch found in `from_delayed`.
Partition type: `DataFrame`
+-----------------+-------+----------+
| Column | Found | Expected |
+-----------------+-------+----------+
| x22 | - | float64 |
| x21 | - | object |
| x20 | - | float64 |
| x19 | - | float64 |
| x18 | - | object |
| x17 | - | float64 |
| x16 | - | object |
| x15 | - | object |
| x14 | - | object |
| x13 | - | object |
| x12 | - | object |
| x11 | - | object |
| x10 | - | object |
| x9 | - | float64 |
| x8 | - | object |
| x7 | - | object |
| x6 | - | object |
| x5 | - | int64 |
| x4 | - | object |
| x3 | - | float64 |
| x2 | - | object |
| x1 | - | object |
+-----------------+-------+----------+
答案 0 :(得分:2)
read_json()
是新的,并针对同类数据的“常见”情况进行了测试。像read_csv
一样,它可以扩展为相当容易地处理列选择和数据类型强制。我注意到pandas function允许传递dtype=
参数。
这不是答案,但也许您会对在repo提交PR感兴趣?特定代码位于文件dask.dataframe.io.json中。
答案 1 :(得分:0)
我遇到了类似的问题,并提出了另一个解决方案:
def read_data(path, **kwargs):
meta = dd.read_json(path, **kwargs).head(0)
meta = meta.head(0)
# edit meta dataframe to match what's read here
def json_engine(*args, **kwargs):
df = pd.read_json(*args, **kwargs)
# add or drop necessary columns here
return df
return dd.read_json(path, meta=meta, engine=json_engine, **kwargs)
因此,此解决方案的想法是您要做两件事:
| Column | Found | Expected |
| x22 | - | object |
在这种情况下,您只需从meta和json_engine()
包装器中删除此列即可。
在这种情况下,您需要向具有必要类型的meta添加必要的列(在这种情况下,BTW meta只是空的pandas数据框),并在必要时在json_engine()
包装器中将这些列添加为空。
还要查看对https://stackoverflow.com/a/50929229/2727308答案的注释中的提案-改用dask.bag。