python - 如何在 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
解决方案
如果match
是索引列,则使用索引切片来获取所需的值:
idx = pd.IndexSlice
df.loc[idx[:,1], :]
分解.loc
语句,第一个参数用于索引,第二个参数用于列。由于您有两个索引列,因此您可以使用包含两个项目的列表从每个索引列中进行选择。第一个项目 ,:
选择第一个索引列中的所有项目。1
第二个仅选择第二个索引列中值为 的行。
如果match
是一列,您可以执行以下操作:
df[df.match == 1]
如果您制作df.match
一列布尔值 ( True
/ False
),您可以只做df[df.match]
.
推荐阅读
- c# - 在 C# 中订阅一个事件到另一个事件有什么作用?
- javascript - 警告:列表中的每个孩子都应该有一个唯一的“关键”道具。即使已经设置了密钥
- c# - 如何保留指向从.NET 调用的 C dll 中生成的 CUDA 纹理对象的指针?
- django - 为什么 Django 管理员给我 TemplateDoesNotExist 错误
- excel - 有没有办法在公式中使用变量,使用 VBA 复制粘贴?
- angular - 这个 Firebase 规则和 PUT 和 GET 请求是否正确?(角度 + Firebase)
- swift - 快速阅读整数问题
- python - Python 实例定义
- python - PermissionError: [WinError 5] Access Denied: [4776] 运行 docker-compose up 时无法执行脚本 docker-compose
- php - 使用归档页而不是单页不当?