Как я могу сделать частичную индексацию на Pandas MultiIndexed DataFrame?

1

Как показано на рисунке, у меня есть дата-схема. Пока я хочу посмотреть строки с "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
    @ASGM Спасибо за совет. Но это происходит из большого текстового файла, поэтому я не уверен, смогу ли я привести весь файл сюда. Кроме того, я пробовал df.loc ['match'], df.loc [(None, 'match')], все они выдают ошибку, что «match» отсутствует в индексе. Я попытался прочитать документацию по Python по MultiIndexing, но это не сильно помогает.
Показать ещё 7 комментариев
Теги:
pandas

1 ответ

1
Лучший ответ

Если match является столбцом индекса, вы используете срез индекса, чтобы получить нужные значения:

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

Разбивая оператор .loc, первый аргумент для индекса, а второй - для столбцов. Поскольку у вас есть два столбца индекса, вы можете использовать список из двух элементов для выбора из каждого столбца индекса. Первый элемент :, выбирает все элементы в первом столбце индекса. Второй выбирает только те строки со значением 1 во втором столбце индекса.

Если match было столбец, вы могли бы сделать следующее:

df[df.match == 1]

Если вы сделаете df.match столбец логических значений (True/False), вы можете просто выполнить df[df.match].

  • 0
    Привет @ASGM, df.match выдает ошибку. Я обновил вопрос с более подробной информацией, если вы хотите посмотреть на него снова. Спасибо!
  • 0
    Я вижу, что не было ясно , в оригинальной версии , что match был столбец индекса. Обновлен соответственно.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню