首页 > 解决方案 > Pandas Dataframe - 按日期对列表元素进行排序,当日期是元素的子字符串时

问题描述

我想根据日期(YYYY_MM_DD)对名为 SESSIONS 的列中每个单元格中的数据进行排序,并且该日期在元素(字符串)形成列表中。SESSIONS 列可以有不同数量的会话,也可以为空。在 SESSIONS 列的一个单元格中,有一个会话列表(就像我在“li”中作为测试示例一样)。以下是在 df 之外执行此操作时的正常工作方式(2019_04_20 显示为最新):

li = ['WE233JP_2015_03_03__13_31_21','WE238JP_2019_04_20__16_40_59','WE932LT_2017_10_12__08_35_49']
li.sort(key = lambda x: datetime.strptime(re.sub(r'^([^_]+)_(.+)__(.+)', r'\2', x), '%Y_%m_%d'))
print(li)

当我尝试使用以下代码将其应用于 df 时(2 次尝试):

df['sessions'] = df.sessions.fillna('NULL').sort_values().apply(lambda x: sorted(datetime.strptime(re.sub(r'^([^_]+)_(.+)__(.+)', r'\2', x), '%Y_%m_%d')))
df['sessions'] = df.sessions.fillna('NULL').sort_values().apply(lambda x: sorted(re.sub(r'^([^_]+)_(.+)__(.+)', r'\2', x)))

在这两种情况下,我都有一个错误:TypeError: expected string or bytes-like object

像下面这样简单的非日期排序可以正常工作:

df['sessions'] = df.sessions.fillna('NULL').sort_values().apply(lambda x: sorted(x))

任何建议如何对格式化为日期的字符串的提取部分进行排序?

标签: python-3.xpandas

解决方案


让我们尝试map使用自定义排序键功能的系列

Sample `df`:
     sessions
0  [WE233JP_2015_03_03__13_31_21, WE238JP_2019_04_20__16_40_59, WE932LT_2017_10_12__08_35_49]
1  NaN

import re    
sort_func = lambda x: pd.to_datetime(re.findall(r'^[^_]+_(.+)__.+', x)[0], 
                                    format='%Y_%m_%d', errors='coerce')
df['sorted_sessions'] = df.sessions.map(lambda y: sorted(y, key=sort_func) 
                                                  if y is not np.nan else y)

Out[1455]:    
sessions  \
0  [WE233JP_2015_03_03__13_31_21, WE238JP_2019_04_20__16_40_59, WE932LT_2017_10_12__08_35_49]
1  NaN                                                                                  

sorted_sessions
0  [WE233JP_2015_03_03__13_31_21, WE932LT_2017_10_12__08_35_49, WE238JP_2019_04_20__16_40_59]
1  NaN

推荐阅读