Python列筛选子字符串
我在python3中有一个使用pandas的数据框,它有一个包含日期字符串的列 这是列的子集Python列筛选子字符串,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我在python3中有一个使用pandas的数据框,它有一个包含日期字符串的列 这是列的子集 ColA "2021-04-03" "2021-04-08" "2020-04-12" "2020-04-08" "2020-04-12" 我想删除两次具有相同月份和日期的行,并保留具有最新年份的行 这将是我期望从这个子集得到的结果 ColA "2021-04-03" "2
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
这比将整个列转换为datetime并提取日期要快得多,因为您正在按原样处理字符串。我不确定您是否可以不使用“应用”来提取日期的相关部分进行分组,但如果您首先将该列转换为datetime类型,这会容易得多:
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()
是的,这就是我一直在寻找的,但不幸的是,当我在我的数据框上应用你的答案时,只有2020年的日期出来了,我希望2021年的日期作为优先权,然后如果它不存在,就取2020年的日期,它必须存在。我们的答案是正确的,只是它应该是max()而不是first()。也许你可以编辑你的帖子,这样我就可以接受你的回答,而且你的预期结果似乎不正确;你想保留最老的年份,所以你应该保留2020-04-08,而不是2021-04-08,等等。是的,你是对的,我更新了问题对不起。。。