【问题标题】:Working with result of pandas.pivot_table使用 pandas.pivot_table 的结果
【发布时间】:2019-03-11 13:32:15
【问题描述】:

我在使用 pandas 的重构数据时遇到了问题。想象一下,我有一个长格式的数据框,例如:

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]

但这会导致关键错误。任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: python-3.x pandas pivot-table


    【解决方案1】:

    使用slicers:

    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
    

    【讨论】:

      【解决方案2】:
      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-16
        • 2018-09-07
        相关资源
        最近更新 更多