python - 根据列条件过滤几乎重复的数据
问题描述
我有一个熊猫数据框,这是一个例子:
names subject date marks
A X 15-05-2021 10
A X 22-05-2021 12
A X 29-05-2021 11
A Y 15-05-2021 15
A Y 22-05-2021 10
B P 22-05-2021 17
B P 29-05-2021 16
B Q 29-05-2021 14
B R 22-05-2021 16
我需要过滤掉“2021 年 5 月 29 日”数据可用的所有姓名、日期和主题。
这就是我需要的:
names subject date marks
A X 15-05-2021 10
A X 22-05-2021 12
A X 29-05-2021 11
B P 22-05-2021 17
B P 29-05-2021 16
B Q 29-05-2021 14
我已经想出了如何做到这一点,但我认为它可以改进。
这就是我现在正在做的事情:
df = pd.read_excel("",name="sheet")
end_date = "29-05-2021"
end_date = pd.to_datetime(end_date)
mask = df["date"] == end_date
temp_df = df.loc[mask]
temp_df = temp_df[["names","subject"]]
result_df = pd.merge(df,temp_df, on = ["names","subject"],how="right"]
有没有改进的余地?
解决方案
我认为性能是您的解决方案很好,使用 remove 有点简化on
(因为通过列名称的交叉连接,here name, subject
)并且需要内部连接,这是默认的,所以也应该省略:
end_date = "29-05-2021"
mask = df["date"] == pd.to_datetime(end_date)
result_df = pd.merge(df,df.loc[mask, ["names","subject"]])
print (result_df)
names subject date marks
0 A X 2021-05-15 10
1 A X 2021-05-22 12
2 A X 2021-05-29 11
3 B P 2021-05-22 17
4 B P 2021-05-29 16
5 B Q 2021-05-29 14
GroupBy.transform
如果 s 大,替代解决方案会慢一些DataFrame
:
end_date = "29-05-2021"
mask = df["date"] == pd.to_datetime(end_date)
df = df[df.assign(m = mask).groupby(['names','subject'])['m'].transform('any')]
推荐阅读
- html - 使用 Thymeleaf (th:each) 我无法在视图中可视化数据我总是得到空白的网络表格
- javascript - Visual Studio 2017 javascript 语法高亮
- node.js - 从 MS SQL .bak 文件中获取信息
- vb.net - 气球提示通知未从系统托盘中清除?
- sql - SQL 查询 - 获取具有空值的记录(但确保它们没有任何其他记录与键与值匹配)
- javascript - 如果一行中断,则中断 CSS 中的所有行
- ios - 为什么当代码从 Alamofire 响应中触发时 KYDrawerController 不显示?
- azure - ERR_CONNECTION_RESET Azure CDN 自定义域 HTTPS
- r - 循环变量名
- travis-ci - TravisCI 与英特尔编译器