Dask 如何旋转 DataFrame

Posted

技术标签:

【中文标题】Dask 如何旋转 DataFrame【英文标题】:Dask how to pivot DataFrame 【发布时间】:2019-03-19 02:00:30 【问题描述】:

我正在使用下面的代码,但在旋转 DataFrame 后出现错误:

数据框:

    name        day        value    time
0   MAC000002   2012-12-16  0.147   09:30:00
1   MAC000002   2012-12-16  0.110   10:00:00
2   MAC000002   2012-12-16  0.736   10:30:00
3   MAC000002   2012-12-16  0.404   11:00:00
4   MAC000003   2012-12-16  0.845   00:30:00

读入数据并进行数据透视

ddf = dd.read_csv('data.csv')
#I added this but didnt fix the error below
ddf.index.name = 'index'

#dask requires string as category type
ddf['name'] = ddf['name'].astype('category')
ddf['name'] =ddf['name'].cat.as_known()

#pivot the table
df = ddf.pivot_table(columns='name', values='value', index='index')
df.head()
#KeyError: 'index'

预期结果(带或不带索引) - 将行转为列而不进行任何值修改:

MAC000002  MAC000003  ...
0.147      0.845
0.110      ...
0.736      ...
0.404      ...

知道为什么我会收到 KeyError 'index' 以及如何克服这个问题吗?

【问题讨论】:

哪一行会产生错误? 您想要的结果究竟是什么 @Cezary.Sz KeyError Traceback (最近一次调用最后一次) in () ----> 1 df.head() @jpp 我在问题中添加了预期结果 不要命名索引尝试ddf.reset_index(),这样你就有一个名为“索引”的列。 【参考方案1】:

根据pivot_table 的文档,index kwarg 的值应引用现有列,因此不应将名称设置为索引,而应创建具有所需索引值的列:

# ddf.index.name = 'index'
ddf['index'] = ddf.index

请注意,这假定索引是您真正旋转的对象。

下面是一个可重现的sn-p:

data = """
   | name       | day       | value |   time
0  | MAC000002  | 2012-12-16|  0.147|   09:30:00
1  | MAC000002  | 2012-12-16|  0.110|   10:00:00
2  | MAC000002  | 2012-12-16|  0.736|   10:30:00
3  | MAC000002  | 2012-12-16|  0.404|   11:00:00
4  | MAC000003  | 2012-12-16|  0.845|   00:30:00
"""

import pandas as pd
from io import StringIO

df = pd.read_csv(StringIO(data), sep='|')
df.columns = [c.strip() for c in df.columns]

import dask.dataframe as dd
ddf = dd.from_pandas(df, npartitions=3)
ddf['index'] = ddf.index

#dask requires string as category type
ddf['name'] = ddf['name'].astype('category')
ddf['name'] =ddf['name'].cat.as_known()

ddf.pivot_table(columns='name', values='value', index='index').compute()

# name    MAC000002     MAC000003  
# index                            
# 0             0.147           NaN
# 1             0.110           NaN
# 2             0.736           NaN
# 3             0.404           NaN
# 4               NaN         0.845

【讨论】:

以上是关于Dask 如何旋转 DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

如何从标准输入读取 dask 数据帧?

如何使用dask.distributed并行化嵌套循环?

如何将数据读取到 dask 数据帧并删除坏行

如何从 CuPy 数组创建一个 dask 数组?

如何将 Dask.DataFrame 转换为 pd.DataFrame?

Dask分布式中如何高效提交大参数任务?