嵌套 Pandas 数据框 - 如何 select / 按数据分组?
Nested Pandas dataframe - How to select / group by data?
我从嵌套字典生成了一个 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.getting 所有数据,其中第二个索引 = "bbb" 包括第一个索引值,如本例所示:
Col1 Col2 Col3
XXX bbb 1 8 1
YYY bbb 8 7 6
ZZZ bbb 2 2 4
2.grouping 多个数据帧中的数据帧按第一个索引值分组("XXX"、"YYY"、...)
浏览 Pandas 文档和相关的 Whosebug 问题并没有让我更进一步...
在嵌套的 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 section
using slicers - other
和groupby
by first level of Multiindex with aggregating e.g. 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
尝试 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
解决方案
import pandas as pd
df.loc[pd.IndexSlice[:, 'bbb'], :]
我从嵌套字典生成了一个 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.getting 所有数据,其中第二个索引 = "bbb" 包括第一个索引值,如本例所示:
Col1 Col2 Col3
XXX bbb 1 8 1
YYY bbb 8 7 6
ZZZ bbb 2 2 4
2.grouping 多个数据帧中的数据帧按第一个索引值分组("XXX"、"YYY"、...)
浏览 Pandas 文档和相关的 Whosebug 问题并没有让我更进一步...
在嵌套的 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 section
using slicers - other
和groupby
by first level of Multiindex with aggregating e.g. 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
尝试 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
解决方案
import pandas as pd
df.loc[pd.IndexSlice[:, 'bbb'], :]