首页 > 解决方案 > 如何在 Pandas MultiIndexed DataFrame 上进行部分索引?

问题描述

我有一个如图所示的数据框。现在,我想查看 'match' == 1 的行。我不知道该怎么做。

最终目标是去掉那些不对应日期的行(可以用​​ match ==0 或 match ==1 表示)

>>> df.to_dict()
  {(1, 0): '09/14/20',
  (1, 1): '90792',
  (2, 0): '5/18/71',
  (3, 0): '8/09/19',
  (4, 0): '6/05/93',
  (4, 1): '90791',
  (5, 0): '8/9/97',
  (6, 0): '12/8/82',
  (7, 0): '8/26/89',
  (7, 1): '90791',
  (8, 0): '10/13/95',
  (8, 1): '90791',
  (9, 0): '4/19/91',
  (10, 0): '04/08/20',
  (10, 1): '04 16',
  (11, 0): '9/20/76',
  (11, 1): '90801',
  (12, 0): '12/08/19'}

PS:我有一个文本文件,我必须从文件的每一行中提取日期。所以我做的是这样的:

import pandas as pd
doc = []
with open('dates.txt') as file:
    for line in file:
        doc.append(line)
    df = pd.Series(doc)

    df = df.str.extractall(r'(?P<Date>(([0123]?\d)|([ADFJMNOS][aceopu][a-z] 
         {1,}))[\s,/-]?(([0123]?\d)|([ADFJMNOS][aceopu][a-z]{1,}))[\s,/-]?(? 
         P<Year>(\d{2}|\d{4})))')
    df.index.rename(['Id','Match'],inplace=True)

我不确定这是否是提取日期(以各种格式存在)并包裹在英文句子中的最有效方法,因此如果有人可以评论我的代码的效率和简洁性,将不胜感激。文本文件中的日期格式如下:

04/20/2009; 04/20/09; 4/20/09; 4/3/09
Mar-20-2009; Mar 20, 2009; March 20, 2009; Mar. 20, 2009; Mar 20 2009;
20 Mar 2009; 20 March 2009; 20 Mar. 2009; 20 March, 2009
Mar 20th, 2009; Mar 21st, 2009; Mar 22nd, 2009
Feb 2009; Sep 2009; Oct 2010
6/2008; 12/2009
2009; 2010

标签: pythonregexpandas

解决方案


如果match是索引列,则使用索引切片来获取所需的值:

idx = pd.IndexSlice
df.loc[idx[:,1], :]

分解.loc语句,第一个参数用于索引,第二个参数用于列。由于您有两个索引列,因此您可以使用包含两个项目的列表从每个索引列中进行选择。第一个项目 ,:选择第一个索引列中的所有项目。1第二个仅选择第二个索引列中值为 的行。

如果match是一列,您可以执行以下操作:

df[df.match == 1]

如果您制作df.match一列布尔值 ( True/ False),您可以只做df[df.match].


推荐阅读