为了账号安全,请及时绑定邮箱和手机立即绑定

Python pandas 列过滤子字符串

Python pandas 列过滤子字符串

繁星coding 2023-06-27 17:30:53
我在 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 来做到这一点,但我的真实数据框有数百行和数十列,因此效率不高。有没有更有效的方法来做到这一点?
查看完整描述

2 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

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


# 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

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


查看完整回答
反对 回复 2023-06-27
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

我不确定您是否可以摆脱使用“应用”来提取日期的相关部分进行分组,但如果您首先将该列转换为 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()


查看完整回答
反对 回复 2023-06-27
  • 2 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信