【问题标题】: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

【问题讨论】:

    标签: python pandas dataframe slice


    【解决方案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
      

      选项2
      pd.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ᴘᴇᴇᴅ 是的,导致多重索引
        猜你喜欢
        • 2017-02-22
        • 2021-08-07
        • 2014-04-19
        • 2019-10-28
        • 2020-06-19
        • 2018-10-27
        • 2020-08-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多