python-3.x - 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))
任何建议如何对格式化为日期的字符串的提取部分进行排序?
解决方案
让我们尝试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
推荐阅读
- iis - IIS 应用程序池应用程序要求输入密码(基本身份验证),但邮递员或失眠症都无法响应
- python-3.x - 当在python中循环时另一列中的相应行发生更改时如何在列中进行任何更改
- mysql - 单个查询以获取基于条件的事件和每个事件之后出现的单个事件?
- pandas - 使用带有空值(NaN、NaT)的 `bdate_range`
- html - 向顶部方向增加高度
- snort - 我的 IDS snort.conf 有问题吗?无法在其他 IP 中检测到 Scan Nmap 和 DOS hping
- jquery-query-builder - Querybuilder.js 添加 AND 和 OR 语句
- html - 如何从搜索栏中检索亚马逊的关键字/短语建议
- python - 全局变量函数
- java - 如何使用单个比较的多个 json 路径过滤comapre 2 json?