gpt4 book ai didi

python - 使用 Dask pivot_table 后,我丢失了索引列

转载 作者:行者123 更新时间:2023-11-28 17:18:40 25 4
gpt4 key购买 nike

在将 pivot_table 用于 Dask Dataframe 并将数据保存到 Parquet 文件后,我丢失了索引列。

import dask.dataframe as dd
import pandas as pd

df=pd.DataFrame()
df["Index"]=[1,2,3,1,2,3]
df["Field"]=["A","A","A","B","B","B"]
df["Value"]=[10,20,30,100,120,130]
df

我的数据框:
   Index Field  Value
0 1 A 10
1 2 A 20
2 3 A 30
3 1 B 100
4 2 B 120
5 3 B 130

达斯克代码:
ddf=dd.from_pandas(df,2)
ddf=ddf.categorize("Field")
ddf=ddf.pivot_table(values="Value", index="Index", columns="Field")
dd.to_parquet("1.parq",ddf)
dd.read_parquet("1.parq").compute()

这给出了一个错误:

ValueError: Multiple possible indexes exist: ['A', 'B']. Please select one with index='index-name'



我可以选择 A 或 B 作为索引,但我缺少索引列。

我试过 dd.to_parquet("1.parq",ddf, write_index=True) ,但它给了我以下错误:

TypeError: cannot insert an item into a CategoricalIndex that is not already an existing category



有人可以帮我将带有“索引”列的表保存到 Parquet 文件中吗?

PS:
ddf.pivot_table(values="Value", index="Index", columns="Field").compute()按预期给出结果:
Field     A      B
Index
1 10.0 100.0
2 20.0 120.0
3 30.0 130.0

并且使用 Pandas 不是解决方案,因为我的数据是 20 GB。

编辑:

我试过
ddf.columns = list(ddf.columns)
dd.to_parquet("1.parq",ddf, write_index=True)

它给了我一个新的错误:

dask.async.TypeError: expected list of bytes



谷歌表明这些错误来自 Tornado 异步库。

最佳答案

这里有两个问题:

  • pivot_table产生一个分类的列索引,因为您将原始列“字段”分类。将索引写入 parquet 会调用数据框上的 reset_index,而 Pandas 无法向列索引添加新值,因为它是分类的。您可以使用 ddf.columns = list(ddf.columns) 避免这种情况.
  • 索引列具有对象 dtype 但实际上包含整数。整数不是对象列中预期的类型之一,因此您应该转换它。

  • 整个块现在看起来像:
    ddf = dd.from_pandas(df,2)
    ddf = ddf.categorize("Field")
    ddf = ddf.pivot_table(values="Value", index="Index", columns="Field")
    ddf.columns = list(ddf.columns)
    ddf = ddf.reset_index()
    ddf['index'] = ddf.index.astype('int64')
    dd.to_parquet("1.parq", ddf)

    关于python - 使用 Dask pivot_table 后,我丢失了索引列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42636152/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com