String"包含" -slicing在Pandas MultiIndex上

时间:2017-05-21 14:11:39

标签: python pandas

如何通过字符串内容对MultiIndex进行切片?即该特定索引是否包含某个字符串?

Out[16]: 

a   c   
a   d   1
ab  d   2

预期产出:

pd.DataFrame(
    pd.factorize(df.values.ravel())[0].reshape(len(df), -1) + 1,
    df.index, df.columns
)

显然最后一点是不可能的。

  • 如何才能优雅地完成这项工作?
  • 你能以某种方式对案例不敏感吗?

3 个答案:

答案 0 :(得分:3)

boolean indexingget_level_valuesstr.contains一起使用:

print (df.index.get_level_values('a'))
Index(['a', 'ab', 'b'], dtype='object', name='a'

print (df.index.get_level_values('a').str.contains('a'))
[ True  True False]

df1 = df[df.index.get_level_values('a').str.contains('a', case=False)]
print (df1)
      val
a  c     
a  d    1
ab d    2

答案 1 :(得分:0)

当索引级别不重要 时,另一种方法是将df.filter(...)与正则表达式结合使用;按列或行浏览数据时超级有帮助。例如,这将以较少的代码为您提供相同的答案:

df.filter(regex=re.compile('A',re.I),axis=0)

enter image description here

但是,此过滤器将在所有索引级别进行过滤,df.filter(regex=re.compile('D',re.I),axis=0)将查看索引“ c”,并显示以下内容:

enter image description here

答案 2 :(得分:0)

另一种方法是使用query

<块引用>

DataFrame 的 DataFrame.index 和 DataFrame.columns 属性 实例默认放置在查询命名空间中,这允许 您将框架的索引和列都视为 框架。

>>> df.query('a.str.contains("a")') 
      val
a  c     
a  d    1
ab d    2

哪个国际海事组织比

更具可读性和简洁性
>>> df[df.index.get_level_values('a').str.contains('a')]