Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python列筛选子字符串_Python_Python 3.x_Pandas_Dataframe - Fatal编程技术网

Python列筛选子字符串

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

我在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

这比将整个列转换为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,等等。是的,你是对的,我更新了问题对不起。。。