如何在Pandas MultiIndexed DataFrame上做部分索引?

时间:2018-10-13 19:34:59

标签: python regex pandas

我有一个数据框,如图所示。现在,我想看看'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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

df[df.match == 1]

如果将df.match设为一列布尔值(True / False),则只需执行df[df.match]