python - 在 Pandas 中为层次索引的内部维度选择不同的值

标签 python pandas

我有一个带有分层索引的大表,并且正在尝试选择它的子集。所讨论的实际表对于 axis-0 索引有 3 个级别,我希望级别 1 和 2 上的所有值以及级别 3 的一个选择。

对于我想要做的一个小型 2 级示例,这里是数据框设置:

import pandas as pd
import numpy as np
df = pd.DataFrame({'I1': [1,1,1,1,2,2,2,2,3,3,3,3], 
                   'I2': ['foo', 'bar', 'blatz', 'blam',
                          'foo', 'bar', 'blatz', 'blam',
                          'foo', 'bar', 'blatz', 'blam'],
                   'V': np.arange(12)})
df = df.set_index(['I1', 'I2'])
print df

生成数据框:

           V
I1 I2       
1  foo     0
   bar     1
   blatz   2
   blam    3
2  foo     4
   bar     5
   blatz   6
   blam    7
3  foo     8
   bar     9
   blatz  10
   blam   11

然后我有一个选择器系列:

> sel = pd.DataFrame({'I1': [1,2,3], 'I2': ['foo', 'blatz', 'bar']}).set_index(['I1'])
> print sel
       I2
I1       
1     foo
2   blatz
3     bar

所以我想做的是使用sel来选择df的子集。如果我只想为每个 I1 使用相同的 I2 值,xs 就可以解决问题,但它似乎不适用于一系列而不是单个值。

我尝试拆开 df 并使用系列来选择列,但这似乎不正确(并且导致我的机器内存不足)。

我的下一次尝试将重置 dfsel 上的索引,然后使用联接。这真的是最好的方法吗,还是我缺少更好的技巧?

最佳答案

您使用join的直觉很好。这就是 Pandas 式的做法:

sel = pd.DataFrame({'I1': [1,2,3], 'I2': ['foo', 'blatz', 'bar']}).set_index(['I1','I2'])
print df.join(sel, how = 'right')

          V
I1 I2      
1  foo    0
2  blatz  6
3  bar    9

关于python - 在 Pandas 中为层次索引的内部维度选择不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27130602/

相关文章:

python - 如何检查瓦片 map 中的碰撞(Python/Pygame)

python - 尝试读取 DBM 文件

python - 如何快速搜索pandas中的重复值?

python - 使用 pandas 处理多选问卷(来自 Google Forms)结果

python - Pandas:根据现有列将列添加到 DataFrame

python - 有没有办法通过正则表达式搜索快速删除大量多余的数据?

python - Python 中的一维马氏距离

python - 使用 sklearn StandardScaler 缩放的数据平均值不为零

python - 根据长度向 df.Column 中的字符串添加尾随 0

python - Pandas :根据另一个数据框分配值