嵌套熊猫数据框 - 如何按数据选择/分组?

Posted

技术标签:

【中文标题】嵌套熊猫数据框 - 如何按数据选择/分组?【英文标题】:Nested Pandas dataframe - How to select / group by data? 【发布时间】:2016-09-01 22:31:53 【问题描述】:

我从嵌套字典生成了一个 Pandas 数据框,如下所示:

                Col1      Col2      Col3
XXX   aaa         1         8         1
      bbb         9         7         4
      ccc         3         5         9
      ddd         2         7         2

YYY   aaa         8         7         6
      bbb         1         7         3
      ccc         2         4         5
      ddd         2         1         1

ZZZ   aaa         2         2         4
      bbb         1         7         5
      ccc         0         1         2
      ddd         0         9         6

我现在正在努力完成以下任务:

1.获取所有数据,其中第二个索引 = "bbb" 包括第一个索引值,如下例所示:

               Col1      Col2      Col3
XXX   bbb         1         8         1
YYY   bbb         8         7         6
ZZZ   bbb         2         2         4  

2.将数据帧分组到按第一个索引值(“XXX”,“YYY”,...)分组的几个数据帧中

浏览 Pandas 文档和相关的 *** 问题并没有让我更进一步......

【问题讨论】:

感谢所有快速解答!我已经接受了 piRSquared 的回答,因为他的方法还通过 df.loc[pd.IndexSlice['XXX'], :] 【参考方案1】:

在嵌套的DataFrame中不是index而是MultiIndex

import pandas as pd
df = pd.DataFrame('Col2': ('ZZZ', 'ccc'): 1, ('ZZZ', 'aaa'): 2, ('ZZZ', 'ddd'): 9, ('XXX', 'aaa'): 8, ('XXX', 'ccc'): 5, ('YYY', 'bbb'): 7, ('XXX', 'ddd'): 7, ('ZZZ', 'bbb'): 7, ('YYY', 'ddd'): 1, ('YYY', 'aaa'): 7, ('YYY', 'ccc'): 4, ('XXX', 'bbb'): 7, 'Col3': ('ZZZ', 'ccc'): 2, ('ZZZ', 'aaa'): 4, ('ZZZ', 'ddd'): 6, ('XXX', 'aaa'): 1, ('XXX', 'ccc'): 9, ('YYY', 'bbb'): 3, ('XXX', 'ddd'): 2, ('ZZZ', 'bbb'): 5, ('YYY', 'ddd'): 1, ('YYY', 'aaa'): 6, ('YYY', 'ccc'): 5, ('XXX', 'bbb'): 4, 'Col1': ('ZZZ', 'ccc'): 0, ('ZZZ', 'aaa'): 2, ('ZZZ', 'ddd'): 0, ('XXX', 'aaa'): 1, ('XXX', 'ccc'): 3, ('YYY', 'bbb'): 1, ('XXX', 'ddd'): 2, ('ZZZ', 'bbb'): 1, ('YYY', 'ddd'): 2, ('YYY', 'aaa'): 8, ('YYY', 'ccc'): 2, ('XXX', 'bbb'): 9)
print df
         Col1  Col2  Col3
XXX aaa     1     8     1
    bbb     9     7     4
    ccc     3     5     9
    ddd     2     7     2
YYY aaa     8     7     6
    bbb     1     7     3
    ccc     2     4     5
    ddd     2     1     1
ZZZ aaa     2     2     4
    bbb     1     7     5
    ccc     0     1     2
    ddd     0     9     6

print df.index
MultiIndex(levels=[[u'XXX', u'YYY', u'ZZZ'], 
                   [u'aaa', u'bbb', u'ccc', u'ddd']],
           labels=[[0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], 
                   [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]])

我想你可以用xs来选择函数:

print df.xs('aaa', level=1)
     Col1  Col2  Col3
XXX     1     8     1
YYY     8     7     6
ZZZ     2     2     4

print df.xs('bbb', level=1)
     Col1  Col2  Col3
XXX     9     7     4
YYY     1     7     3
ZZZ     1     7     5

Multiindex 在文档中是here。

选择:cross sectionusing slicers - 其他solution

groupby 由 Multiindex 的第一级聚合,例如mean:

print df.groupby(level=0).mean()
     Col1  Col2  Col3
XXX  3.75  6.75  4.00
YYY  3.25  4.75  3.75
ZZZ  0.75  4.75  4.25

Groupby with multiindex

【讨论】:

【参考方案2】:

尝试 get_level_values,如下所示:

df.iloc[df.index.get_level_values(1) == 'bbb']

您可以使用df.index.get_level_values 公开索引级别和标签,然后相应地构造您的 .iloc[]。

<bound method MultiIndex.get_level_values of MultiIndex ( levels=[[u'bar', u'baz', u'foo', u'qux'] , [u'one', u'two']], labels=[[0, 0, 1, 1, 2, 2, 3, 3] , [0, 1, 0, 1, 0, 1, 0, 1]] )>

这是一个有用的参考:

selecting from multi-index pandas

【讨论】:

【参考方案3】:

解决方案

import pandas as pd

df.loc[pd.IndexSlice[:, 'bbb'], :]

【讨论】:

以上是关于嵌套熊猫数据框 - 如何按数据选择/分组?的主要内容,如果未能解决你的问题,请参考以下文章

如何按多列分组以在熊猫数据框中列出

来自按级别分组的多索引熊猫数据框的子图

如何在熊猫中分组、循环和获取结果作为数据框

按对象将熊猫分组转换为多索引数据框

在熊猫数据框中按日期和计数值分组

熊猫数据框:按列子集+按另一列分组