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

时间:2017-03-06 21:44:20

标签: python dask

在对Dask Dataframe使用pivot_table并将数据保存到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

Dask代码:

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-name'

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

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

  

TypeError:无法将项目插入到不是的CategoricalIndex中   已经是现有的类别

有人可以帮我保存表格中的列"索引"进入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异步库。

1 个答案:

答案 0 :(得分:2)

这里有两个问题:

pivot_table会生成一个分类列索引,因为您将原始列“字段”分类。 将索引写入镶木地板会在数据框上调用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)