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 来做到这一点,但我的真实数据框有数百行和数十列,因此效率不高。有没有更有效的方法来做到这一点?


繁星coding
浏览 125回答 2
2回答

斯蒂芬大帝

有几种方法可以做到这一点。其中之一是提取年份,按年份排序,并删除具有重复月日对的行。# separate year and month-day pairsdf['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-day2  2020-04-12  2020  04-123  2020-04-08  2020  04-084  2020-04-12  2020  04-120  2021-04-03  2021  04-031  2021-04-08  2021  04-08之后,我们可以简单地删除重复项并删除附加列:# drop duplicate month-day pairsdf.drop_duplicates('mo-day', keep='first', inplace=True)# get rid of the two columnsdf.drop(['year','mo-day'], axis=1, inplace=True)# since we dropped duplicate, reset the indexdf.reset_index(drop=True, inplace=True)print(df)最后结果:         ColA0  2020-04-121  2020-04-082  2021-04-03这比将整个列转换为日期时间并提取日期要快得多,因为您按原样使用字符串。

慕娘9325324

我不确定您是否可以摆脱使用“应用”来提取日期的相关部分进行分组,但如果您首先将该列转换为 pandas 日期时间类型,这会容易得多:df = pd.DataFrame({'colA':["2021-04-03","2021-04-08","2020-04-12","2020-04-08","2020-04-12"]})df['colA'] = df.colA.apply(pd.to_datetime)然后您可以按(日、月)分组并保留最高值,如下所示:df.groupby(df.colA.apply(lambda x: (x.day, x.month))).max()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python