Панды эквивалент Reshape2 Acast - PullRequest
       5

Панды эквивалент Reshape2 Acast

0 голосов
/ 24 октября 2018

У меня есть набор данных некоторых временных рядов, который выглядит следующим образом:

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.Для данного pandas dataframe:

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 голосов
/ 24 октября 2018

Примерно так будет преобразовывать ваши данные в MultiIndexed DataFrame, который является одним из способов работы с> 2D данными в пандах.Обратите внимание на изменение aggfunc - обычно по умолчанию используется числовая агрегация, лямбда которой просто проходит через данные без изменений.

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 .Например, чтобы выбрать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...