首页 > 解决方案 > 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 来做这件事,但我的真实数据框有数百行和数十列,所以效率不高。有没有更有效的方法来做到这一点?

标签: pythonpython-3.xpandasdataframe

解决方案


有几种方法可以做到这一点。其中之一是提取年份,按年份排序,然后删除具有重复月日对的行。

# 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

这比将整个列转换为日期时间并提取日期要快得多,因为您正在使用字符串。


推荐阅读