Работа с результатом pandas.pivot_table - PullRequest
0 голосов
/ 11 марта 2019

У меня проблемы с использованием измененных данных с пандами. Представьте, что у меня есть датафрейм в длинном формате, например:

town    year    type    var1    var2
a       2010    a       100     200
b       2010    a       100     200
c       2010    a       100     200
a       2011    a       100     200
b       2011    a       100     200
c       2011    a       100     200
a       2010    b       100     200
b       2010    b       100     200
c       2010    b       100     200
a       2011    b       100     200
b       2011    b       100     200
c       2011    b       100     200

Затем я преобразую его в широкий формат, например:

df = pd.pivot_table(df, index="town", columns=["year", "type"], values=["var1", "var2"]

                var1                var2
    year    2010      2011      2010      2011
    type    a    b    a    b    a    b    a    b
    town    
    a       100  200  100  200  100  200  100  200
    b       100  200  100  200  100  200  100  200
    c       100  200  100  200  100  200  100  200

Как мне получить доступ к результирующему фрейму данных? Например, если бы я хотел получить данные по всем городам, но только за 2010 год и типа b? Я пытался использовать df.query, но это приводит к несоответствию типа буфера. Я пытался использовать:

df[df["year"] == 2010]

Но это приводит к ключевой ошибке. Любая помощь будет принята с благодарностью. Спасибо

Ответы [ 2 ]

2 голосов
/ 11 марта 2019

Использование slicer с:

idx = pd.IndexSlice
df = df.loc[:, idx[:, 2010, 'b']]
print (df)
     var1 var2
year 2010 2010
type    b    b
town          
a     100  200
b     100  200
c     100  200

Или DataFrame.xs:

df = df.xs((2010, 'b'), axis=1, level=[1,2])
print (df)
      var1  var2
town            
a      100   200
b      100   200
c      100   200

Решение с фильтрацией по Index.get_level_values и логическая маска с цепочкой по & для побитового И, но поскольку столбцам фильтра необходимо DataFrame.loc (первые : означают все строки):

m1 = df.columns.get_level_values('year') == 2010
m2 = df.columns.get_level_values('type') == 'b'

df = df.loc[:, m1 & m2]
print (df)
     var1 var2
year 2010 2010
type    b    b
town          
a     100  200
b     100  200
c     100  200
0 голосов
/ 11 марта 2019
import pandas as pd
df = pd.read_csv('test.csv')
df1 = df.groupby(['year', 'type']).sum()
df1

df может получить таблицу, тогда просто используйте groupby, я думаю, это проще. что я получаю

           var1 var2
year  type      
2010    a   300 600
        b   300 600
2011    a   300 600
        b   300 600
...