Python:Pandas使用大于0.20的.describe()版本的切片

时间:2017-07-10 04:31:38

标签: python pandas slice

使用它因为方便。

http://nbviewer.jupyter.org/gist/aflaxman/436cde71f85b93638959

df = pd.DataFrame({'A': [0,0,0,0,1,1],
                   'B': [1,2,3,4,5,6],
                   'C': [8,9,10,11,12,13]})

This use to work!

这种用法起作用!

现在:

>>> pandas.__version__
u'0.20.3'

df.groupby('A').describe().unstack()\
    .loc[:,(slice(None),['count','mean']),]

给出:

TypeError: '['count', 'mean']' is an invalid key

1 个答案:

答案 0 :(得分:3)

对于列删除unstack,因为版本0.20.0已更改groupby describe formatting

df = df.groupby('A').describe().loc[:,(slice(None),['count','mean'])]
print (df)

      B          C      
  count mean count  mean
A                       
0   4.0  2.5   4.0   9.5
1   2.0  5.5   2.0  12.5

MultiIndex位于index,因此删除了第一个:,因为选择了所有索引值。

此外还添加了slice(None),因为MultiIndex3 levels

df = df.groupby('A').describe().unstack()\
    .loc[(slice(None),['count','mean'],slice(None))]

print (df)

          A
B  count  0     4.0
          1     2.0
   mean   0     2.5
          1     5.5
C  count  0     4.0
          1     2.0
   mean   0     9.5
          1    12.5
dtype: float64

替代解决方案:

idx = pd.IndexSlice
df = df.groupby('A').describe().unstack()\
    .loc[idx[:,['count','mean'],:]]

print (df)
          A
B  count  0     4.0
          1     2.0
   mean   0     2.5
          1     5.5
C  count  0     4.0
          1     2.0
   mean   0     9.5
          1    12.5
dtype: float64
df = df.groupby('A').describe().unstack()\
    .loc(axis=0)[:,['count','mean'],:]

print (df)
          A
B  count  0     4.0
          1     2.0
   mean   0     2.5
          1     5.5
C  count  0     4.0
          1     2.0
   mean   0     9.5
          1    12.5
dtype: float64

pandas documentation - using slicers 中的更多信息。