相当于reshape2的熊猫

时间:2018-10-24 19:34:27

标签: python r pandas tidyverse

我有一些时间序列数据的数据集,如下所示:

df <- tibble(location = c('f1','f1','f1','f1'),
             year = c('1999','1999','1999','1999'),
             day = c('01-01','01-02','01-01','01-02'),
             variable = c('var1','var1','var2','var2'),
             value = c(1.0, 3.0, "option1","option2"))

在R中,我可以将其转换为这样的数据结构,其中将位置+年作为1轴,将日期与另一个轴,而将变量作为第三个轴,并使用reshape2::acast

> reshape2::acast(df, location + year ~ day ~ variable)
, , var1

        01-01 01-02
f1_1999 "1"   "3"  

, , var2

        01-01     01-02    
f1_1999 "option1" "option2"

如何使用Pandas数据框实现相同的效果?我的第一次尝试是使用pivotpivot_table,但我想我误会了它们的工作方式:pandas.pivot_table(df, index = ['location','year'], columns = 'day', values = 'variable')产生错误DataError: No numeric types to aggregate。给定一个熊猫数据框:

import pandas as pd
df = pd.DataFrame({
    'location': ['f1','f1','f1','f1'],
    'year': ['1999','1999','1999','1999'],
    'day': ['01-01','01-02','01-01','01-02'],
    'variable': ['var1','var1','var2','var2'],
    'value': [1.0, 3.0, 'option1','option2']
})

有什么方法可以在R中实现相同的数据结构(使用numpy数组之类的东西)?

1 个答案:

答案 0 :(得分:1)

类似的事情会将您的数据重塑成MultiIndexed DataFrame,这是在熊猫中处理2D数据的一种方法。请注意aggfunc的更改-通常它默认为数字聚合,即lambda只是不更改地传递数据。

res = df.pivot_table(index=['location', 'year'], 
                     columns=['variable', 'day'], 
                     values='value', 
                     aggfunc=lambda x: x)
res
Out[7]: 
variable       var1           var2         
day           01-01 01-02    01-01    01-02
location year                              
f1       1999     1     3  option1  option2

从那里,查看MultiIndexing docs了解更多信息。例如,选择day == '01-02'

idx = pd.IndexSlice   
res.loc[:, idx[:, '01-02']]

Out[12]: 
variable       var1     var2
day           01-02    01-02
location year               
f1       1999     3  option2