熊猫如何切片多索引数据框?

Posted

技术标签:

【中文标题】熊猫如何切片多索引数据框?【英文标题】:Pandas How to slice multiindex Dataframe? 【发布时间】:2018-07-28 13:28:21 【问题描述】:
           name                     address             contact_info    
        first_name  last_name       stret   city    mobile      email
    1   AAA             BBB         XXX     YYY     02020       aaa@xyz.com
    2   111             222         333     444     239393      bbb@xyz.com

我有一个上述格式的 excel。我想要的是在 name 中包含每一列,然后只有 contact_info 中的 mobile 列才会有人告诉我如何做到这一点。以下代码为我提供了 namecontact_info

中的所有内容
import pandas as pd
df = pd.read_excel("test.xlsx", header=[0, 1], sheet_name="Mapping")
print df[["name", "contact_info"]]

我正在尝试得到这样的东西,

first_name  last_name   mobile
AAA         BBB        102020
111         222        239393

【问题讨论】:

【参考方案1】:

不知道为什么要避免连接,但这样做:

df = pd.read_excel("multi-index-test.xlsx", header=[0, 1], sheet_name="Mapping")
df.drop('address', level=0, axis=1).drop('e-mail', level=1, axis=1)

这利用了MultiIndex.drop()。

【讨论】:

【参考方案2】:

选项 1 我能想到的最简单的方法是列切片:

df['name'].join(df['contact_info']['mobile'])

  first_name last_name  mobile
1        AAA       BBB  020202
2        111       222  239393

选项2pd.DataFrame.filter

df.filter(regex='name|mobile')

        name           contact_info
  first_name last_name       mobile
1        AAA       BBB       020202
2        111       222       239393

我们可以降级

d = df.filter(regex='name|mobile')
d.columns = d.columns.droplevel(0)
d

  first_name last_name  mobile
1        AAA       BBB  020202
2        111       222  239393

【讨论】:

很好,过滤习语在这里很有用,将提交记忆。【参考方案3】:

您要查找的内容只需要 basic indexing on a multiindex 和 concat。这是一个例子:

df = pd.read_excel("multi-index-test.xlsx", header=[0, 1])
df1 = df[["name"]]
df2 = df['contact_info', 'mobile']
pd.concat([df1, df2], axis=1)

我相信这个解决方案的好处是 1) 简单和 2) 通用。

【讨论】:

【参考方案4】:

您可以在这里使用df.xs

i = df.xs('name', axis=1)
j = df.xs('mobile', axis=1, level=-1)

pd.concat([i, j], axis=1)

  first_name last_name  contact_info
1        AAA       BBB          2020
2        111       222        239393

【讨论】:

有什么理由可以不用 concat。【参考方案5】:

通过使用IndexSlice + concat

idx = pd.IndexSlice
pd.concat([df.loc[:, idx['name',:]],df.loc[:,idx[:,'mobile']]])
Out[104]: 
   contact_info       name          
         mobile first_name last_name
1           NaN        AAA       BBB
2           NaN        111       222
1          2020        NaN       NaN
2        239393        NaN       NaN

【讨论】:

嗯,这里好像不能避免concat。 @cᴏʟᴅsᴘᴇᴇᴅ 是的,导致多重索引

以上是关于熊猫如何切片多索引数据框?的主要内容,如果未能解决你的问题,请参考以下文章

切片具有大列表的多索引熊猫数据框

对唯一顺序索引的多索引熊猫数据框进行切片和赋值

将熊猫多索引切片彼此分开

熊猫:切片多索引与许多索引

将值从一个数据帧切片复制到另一个:使用“IndexSlice”的多索引熊猫数据帧的切片是不是总是一致地排序?

基于多索引列数据框中的列范围进行切片