如果我定义一个像这样的分层索引数据框:
import itertools
import pandas as pd
import numpy as np
a = ('A', 'B')
i = (0, 1, 2)
b = (True, False)
idx = pd.MultiIndex.from_tuples(list(itertools.product(a, i, b)),
names=('Alpha', 'Int', 'Bool'))
df = pd.DataFrame(np.random.randn(len(idx), 7), index=idx,
columns=('I', 'II', 'III', 'IV', 'V', 'VI', 'VII'))
内容如下所示:
In [19]: df
Out[19]:
I II III IV V VI VII
Alpha Int Bool
A 0 True -0.462924 1.210442 0.306737 0.325116 -1.320084 -0.831699 0.892865
False -0.850570 -0.949779 0.022074 -0.205575 -0.684794 -0.214307 -1.133833
1 True 0.603602 1.387020 -0.830780 -1.242000 -0.321938 0.484271 0.171738
False -1.591730 1.282136 0.095159 -1.239882 0.760880 -0.606444 -0.485957
2 True -1.346883 1.650247 -1.476443 2.092067 1.344689 0.177083 0.100844
False 0.001407 -1.127299 -0.417828 0.143595 -0.277838 -0.478262 -0.350906
B 0 True 0.722781 -1.093182 0.237536 0.457614 -2.500885 0.338257 0.009128
False 0.321022 0.419357 1.161140 -1.371035 1.093696 0.250517 -1.125612
1 True 0.237441 1.739933 0.029653 0.327823 -0.384647 1.523628 -0.009053
False -0.459148 -0.598577 -0.593486 -0.607447 1.478399 0.504028 -0.329555
2 True -0.583052 -0.986493 -0.057788 -0.639798 1.400311 0.076471 -0.212513
False 0.896755 2.583520 1.520151 2.367336 -1.084994 -1.233548 -2.414215
我知道如何提取与给定列对应的数据。例如。对于列'VII'
:
In [20]: df['VII']
Out[20]:
Alpha Int Bool
A 0 True 0.892865
False -1.133833
1 True 0.171738
False -0.485957
2 True 0.100844
False -0.350906
B 0 True 0.009128
False -1.125612
1 True -0.009053
False -0.329555
2 True -0.212513
False -2.414215
Name: VII
如何提取符合以下标准集的数据:
阿尔法=='B'
Alpha=='B'
, Bool==False
Alpha=='B'
, Bool==False
, column 'I'
Alpha=='B'
, Bool==False
, 列 'I'
和 'III'
Alpha=='B'
、Bool==False
、列'I'
、'III'
以及从'V'
开始的所有列整型
是偶数(顺便说一句,我做了不止一次rtfm,但我真的觉得难以理解。)
可以用pd。直观方式的IndexSlice(受此答案启发)。一些例子(使用pandas 0.18.0):
df.sort_index(inplace=True)
idx = pd.IndexSlice
evens = np.arange(2,max(df.index.levels[1])+1,2)
df.loc[idx[['A','B'],evens,True],['III','V']]
Out[]:
III V
Alpha Int Bool
A 2 True -1.041243 -0.561155
B 2 True 0.381918 -0.148990
df.loc[idx[:,evens,:],:]
Out[]:
I II III IV V VI \
Alpha Int Bool
A 2 False 0.791142 0.333383 0.089767 -0.584465 0.295676 -1.323792
True -1.023160 -0.442004 -1.041243 1.613184 -0.561155 0.397923
B 2 False 0.383229 -0.052715 -0.214347 -2.041429 -1.101059 -0.374035
True -0.183386 -0.855367 0.381918 -0.261106 -0.148990 0.621537
VII
Alpha Int Bool
A 2 False 0.717301
True -0.133701
B 2 False 0.166314
True 0.517513
xs可能是您想要的。以下是一些示例:
In [63]: df.xs(('B',), level='Alpha')
Out[63]:
I II III IV V VI VII
Int Bool
0 True -0.430563 0.139969 -0.356883 -0.574463 -0.107693 -1.030063 0.271250
False 0.334960 -0.640764 -0.515756 -0.327806 -0.006574 0.183520 1.397951
1 True -0.450375 1.237018 0.398290 0.246182 -0.237919 1.372239 -0.805403
False -0.064493 0.967132 -0.674451 0.666691 -0.350378 1.721682 -0.791897
2 True 0.143154 -0.061543 -1.157361 0.864847 -0.379616 -0.762626 0.645582
False -3.253589 0.729562 -0.839622 -1.088309 0.039522 0.980831 -0.113494
In [64]: df.xs(('B', False), level=('Alpha', 'Bool'))
Out[64]:
I II III IV V VI VII
Int
0 0.334960 -0.640764 -0.515756 -0.327806 -0.006574 0.183520 1.397951
1 -0.064493 0.967132 -0.674451 0.666691 -0.350378 1.721682 -0.791897
2 -3.253589 0.729562 -0.839622 -1.088309 0.039522 0.980831 -0.113494
编辑:
对于最后一个需求,您可以链接get_level_values
和isin
:
获取索引中的偶数值(也有其他方法)
In [87]: ix_vals = set(i for _, i, _ in df.index if i % 2 == 0)
ix_vals
Out[87]: set([0L, 2L])
将这些与 isin 一起使用
In [89]: ix = df.index.get_level_values('Int').isin(ix_vals)
In [90]: df[ix]
Out[90]: I II III IV V VI VII
Alpha Int Bool
A 0 True -1.315409 1.203800 0.330372 -0.295718 -0.679039 1.402114 0.778572
False 0.008189 -0.104372 0.419110 0.302978 -0.880262 -1.037645 -0.264265
2 True -2.414290 0.896990 0.986167 -0.527074 0.550753 -0.302920 0.228165
False 1.275831 0.448089 -0.635874 -0.733855 -0.747774 -1.108976 0.151474
B 0 True -0.430563 0.139969 -0.356883 -0.574463 -0.107693 -1.030063 0.271250
False 0.334960 -0.640764 -0.515756 -0.327806 -0.006574 0.183520 1.397951
2 True 0.143154 -0.061543 -1.157361 0.864847 -0.379616 -0.762626 0.645582
False -3.253589 0.729562 -0.839622 -1.088309 0.039522 0.980831 -0.113494
主要内容:重置行列标签,填充元素值,限制填充行数,重命名标签重置索引(reindex)可以更改原 DataFrame 的行标签或列标签,并使更改后的行、列标签与 DataFrame 中的数据逐一匹配。通过重置索引操作,您可以完成对现有数据的重新排序。如果重置的索引标签在原 DataFrame 中不存在,那么该标签对应的元素值将全部填充为 NaN。 重置行列标签 看一组简单示例: 输出结果: 现有 a、b 两个 DataFrame 对象,如果想让 a 的行
本文向大家介绍对Pandas MultiIndex(多重索引)详解,包括了对Pandas MultiIndex(多重索引)详解的使用技巧和注意事项,需要的朋友参考一下 创建多重索引 获得索引信息 get_level_values 基本索引 使用reindex对齐数据 数据准备 s序列加(0~-2)索引的值,因为s[:-2]没有最后两个的索引,所以为NaN.s[::2]意思是步长为1. 以上这篇对P
本文向大家介绍在pandas多重索引multiIndex中选定指定索引的行方法,包括了在pandas多重索引multiIndex中选定指定索引的行方法的使用技巧和注意事项,需要的朋友参考一下 在multiIndex中选定指定索引的行 我们在用pandas类似groupby来使用多重index时,有时想要对多个level中的某个index对应的行进行操作,就需要在dataframe中找到该index
鉴于此示例: 我想得到那些索引,其中col1: 预期结果将是一个向量。
我有两个数据集。 第一个,在市场变量中包含具有以下结构的一般市场趋势: 第二,在心情变量中,每一天都包含一些推文,在这个结构中带有同样的情绪: 所以,我想每天数一数有多少“熊市”和“牛市”情绪。它的工作原理,这是我的代码与注释: 结果如下: 所以它工作得很好,但我不明白为什么我不能访问或索引。 事实上,如果我尝试这样的事情: 我获得: 我错过了什么吗?谢啦
问题内容: 我在pandas df中有一个包含多索引列的数据集,我想按特定列中的值进行排序。我尝试使用sortindex和sortlevel,但无法获得所需的结果。我的数据集看起来像: 我想按降序按组1中的C列对所有数据和索引进行排序,因此我的结果如下所示: 是否可以对数据所在的结构进行这种排序,还是应该将Group1交换到索引端? 问题答案: 当按MultiIndex排序时,您需要在列表中包含描