pandas将数据帧转换为3d数据

时间:2012-11-06 23:39:53

标签: python pandas

似乎有很多可能将平面数据转换为3d数组,但我在某种程度上找不到一个有效的方法:假设我有一些数据有列= ['name','type','date ','价值']。当我尝试通过

转动时
pivot(index='name', columns=['type', 'date'], values='value')

我得到了

ValueError: Buffer has wrong number of dimensions (expected 1, got 2)

我是否可以阅读开发熊猫的文档?看起来这就是那里描述的用法。我正在跑0.8只熊猫。

我想,我想知道我是否有一个MultiIndex ['x','y','z']系列,是否有大熊猫方式将其放入面板?我可以使用groupby并完成工作,但这几乎就像我在numpy中组装n-d数组时所做的那样。看起来像是一个相当通用的操作,所以我想它可能已经实现了。

2 个答案:

答案 0 :(得分:8)

pivot仅支持使用单个列生成列。您可能希望使用pivot_table来生成使用多列的数​​据透视表,例如

pandas.tools.pivot.pivot_table(your_dataframe, values='value', index='name', columns=['type', 'date'], aggfunc='sum')

pivotAPI reference pivot_table中提及的层次结构列与您有多个字段而非多个的情况相关类

假设'type'和'date'是类别,其值应该用作列名,那么您应该使用pivot

但是,如果您想为同一类别(例如“类型”)的不同值字段使用单独的列,则应使用df = DataFrame({'name': ['A', 'B', 'A', 'B'], 'type': [1, 1, 2, 2], 'date': ['2012-01-01', '2012-01-01', '2012-02-01', '2012-02-01'], 'value': [1, 2, 3, 4]}) pt = df.pivot_table(values='value', index='name', columns=['type', 'date']) p = df.pivot('name', 'type') 而不指定值列,将类别指定为columns参数。

例如,假设您有此DataFrame:

type           1           2
date  2012-01-01  2012-02-01
name                        
A              1           3
B              2           4

将是:

          date              value   
type           1           2      1  2
name                                  
A     2012-01-01  2012-02-01      1  3
B     2012-01-01  2012-02-01      2  4

和p将是:

index

注意:对于pandas版本< 0.14.0,columnsrows关键字参数应分别替换为cols和{{1}}。

答案 1 :(得分:4)

原帖以问题结束:

  

“我想知道我是否有一个MultiIndex ['x','y','z']系列,是否有大熊猫方式将其放入面板?”

我自己正在寻找解决方案。

我最终得到了以下内容:

In [1]: import pandas as pd

## generate xyz example:
In [3]: df = pd.DataFrame({col:pd.np.random.randint(0,10,10) 
                               for col in ['x','y','z','data']})

## set all x,y,z coordinates as indices
In [5]: df.set_index(['x','y','z'], inplace=True)

## set the z coordinate as headers of the columns 
# NB: this is will turn the data into "dense" with NaNs where there were no 'data'
In [7]: df = df['data'].unstack()

## now it is ready to be "pivot"ed into a panel
In [9]: data_panel = df.to_panel()

In [10]: df
Out[10]: 
     data                        
z       1   3   4   5   6   7   9
x y                              
1 5   NaN NaN NaN NaN NaN NaN   1
  6   NaN NaN NaN NaN NaN NaN   0
2 9   NaN NaN NaN NaN NaN   1 NaN
3 9     6 NaN NaN NaN NaN NaN NaN
5 9   NaN NaN NaN NaN NaN NaN   8
7 1   NaN NaN NaN NaN   8 NaN NaN
  3   NaN NaN NaN NaN NaN NaN   5
  7   NaN NaN NaN   1 NaN NaN NaN
  9   NaN   0 NaN NaN NaN NaN NaN
9 5   NaN NaN   1 NaN NaN NaN NaN

[10 rows x 7 columns]

In [11]: data_panel
Out[11]: 
<class 'pandas.core.panel.Panel'>
Dimensions: 7 (items) x 6 (major_axis) x 6 (minor_axis)
Items axis: 1 to 9
Major_axis axis: 1 to 9
Minor_axis axis: 1 to 9

列标题将是Panel的项目,第一级索引是MajorAxis(行),第二级是MinorAxis(列)