python - Python pandas 列过滤子字符串
问题描述
我在 python3 中有一个使用 pandas 的数据框,其中有一列包含一个带日期的字符串。
这是列的子集
ColA
"2021-04-03"
"2021-04-08"
"2020-04-12"
"2020-04-08"
"2020-04-12"
我想删除两次具有相同月份和日期的行,并保留最新年份的行。
这将是我期望从这个子集得到的结果
ColA
"2021-04-03"
"2021-04-08"
"2020-04-12"
最后两行被删除,因为 2020-04-12 和 2020-04-08 的日期已经在 2021 年。
我想用 apply 和 lambda 来做这件事,但我的真实数据框有数百行和数十列,所以效率不高。有没有更有效的方法来做到这一点?
解决方案
有几种方法可以做到这一点。其中之一是提取年份,按年份排序,然后删除具有重复月日对的行。
# separate year and month-day pairs
df['year'] = df['ColA'].apply(lambda x: x[:4])
df['mo-day'] = df['ColA'].apply(lambda x: x[5:])
df.sort_values('year', inplace=True)
print(df)
这是分离和排序后的样子:
ColA year mo-day
2 2020-04-12 2020 04-12
3 2020-04-08 2020 04-08
4 2020-04-12 2020 04-12
0 2021-04-03 2021 04-03
1 2021-04-08 2021 04-08
之后,我们可以简单地删除重复项并删除其他列:
# drop duplicate month-day pairs
df.drop_duplicates('mo-day', keep='first', inplace=True)
# get rid of the two columns
df.drop(['year','mo-day'], axis=1, inplace=True)
# since we dropped duplicate, reset the index
df.reset_index(drop=True, inplace=True)
print(df)
最后结果:
ColA
0 2020-04-12
1 2020-04-08
2 2021-04-03
这比将整个列转换为日期时间并提取日期要快得多,因为您正在使用字符串。
推荐阅读
- node.js - Visual Studio Code 不建议任何 Node.js 语法
- r - 如何使用带有 Rscript 的 API 密钥在 Postman 中对自己进行身份验证
- python - 满足条件时终止的循环
- javascript - Openlayers 悬停渲染顺序,悬停特征渲染在所有其他特征之上
- c - 在 Visual Studio Code(或 VS2019)中运行 C 程序
- c# - 导出 DataTable C# 以访问 - 慢问题 - 100 万行和 29 列
- java - 使用管道直径计显示特殊字符
- github - 当内容存储在 docs 文件夹中时,如何通过自定义域提供 Github 页面?
- algorithm - 来自“编译器 - 原理、技术和工具”(又名 Dragon Book)的练习 4.2.8
- c - 使用指针将输入读入数组时如何正确使用scanf()?