我有一些时间序列数据的数据集,如下所示:
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数据框实现相同的效果?我的第一次尝试是使用pivot
或pivot_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数组之类的东西)?
答案 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