【问题标题】:After using Dask pivot_table I lose the index column使用 Dask pivot_table 后,我丢失了索引列
【发布时间】:2017-03-06 21:44:20
【问题描述】:

在将 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:存在多个可能的索引:['A', 'B']。请 选择一个 index='index-name'

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

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

TypeError: 无法将项目插入到非分类索引中 已经是一个现有的类别

有人可以帮我将包含“索引”列的表格保存到 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:预期的字节列表

Google 显示这类错误是由 Tornado 异步库引起的。

【问题讨论】:

    标签: python dask


    【解决方案1】:

    这里有两个问题:

    1. pivot_table 生成一个分类的列索引,因为您将原始列“字段”设为分类。将索引写入 parquet 调用数据帧上的 reset_index,并且 pandas 无法向列索引添加新值,因为它是分类的。您可以使用ddf.columns = list(ddf.columns) 来避免这种情况。

    2. 索引列具有对象 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)
    

    【讨论】:

    • 1.如果没有分类,我对 pivot_table 有以下错误: ValueError: 'columns' must be category dtype。 2. ddf.columns = list(ddf.columns) 和 write_index 给出了另一个错误:dask.async.TypeError: expected list of bytes。所以两者都没有帮助。
    • 我也试过 ddf.columns=pd.Index(list(ddf.columns))。现在这个类和以前一样了,但它仍然抛出一个错误:dask.async.TypeError: expected list of bytes。您还有其他想法吗?
    • 已编辑。显然这可能更友好。
    • 成功了,谢谢!很高兴有人可以回答有关 dask 的问题!据我了解,您与 dask 的开发有关。我认为将行减少到 ddf.pivot_table(); 是个好主意。 dd.to_parquet()
    • 我完全同意 - 请随时提出issue。我必须诚实地说我并不完全理解 dataframe.pivot_table 中发生的事情。
    猜你喜欢
    • 2018-09-03
    • 2013-07-18
    • 1970-01-01
    • 2016-02-14
    • 2020-12-13
    • 2023-04-08
    • 2020-10-05
    • 2021-10-30
    • 2014-10-21
    相关资源
    最近更新 更多