如何按最新PUBLISH_TIME筛选Pandas DataFrame获取DATE和VALUE?
问题与解决方案
问题描述
需要筛选Pandas DataFrame,仅保留与最新PUBLISH_TIME对应的DATE和VALUE列。原始DataFrame数据:
PUBLISH_TIME DATE VALUE 0 2022-01-04 00:52:30 2022-01-04 490 1 2022-01-04 10:01:45 2022-01-04 503 2 2022-01-04 10:09:04 2022-01-04 504 3 2022-01-05 00:44:16 2022-01-05 513 4 2022-01-05 10:18:44 2022-01-05 527 5 2022-01-06 01:03:16 2022-01-06 527 6 2022-01-06 10:09:08 2022-01-06 520
期望结果:
DATE VALUE 2022-01-04 490 2022-01-05 513 2022-01-05 527
DataFrame构造代码:
import pandas as pd x = { "PUBLISH_TIME": [ "2022-01-04 00:52:30", "2022-01-04 10:01:45", "2022-01-04 10:09:04", "2022-01-05 00:44:16", "2022-01-05 10:18:44", "2022-01-06 01:03:16", "2022-01-06 10:09:08" ], "DATE": [ "2022-01-04", "2022-01-04", "2022-01-04", "2022-01-05", "2022-01-05", "2022-01-06", "2022-01-06" ], "VALUE": [ 490, 503, 504, 513, 527, 527, 520 ] } df = pd.DataFrame(x)
尝试的错误代码:df.groupby('PUBLISH_TIME').apply(max)[['DATE', 'VALUE']],未得到预期结果。
错误原因分析
你尝试的代码逻辑有误:PUBLISH_TIME的每个值都是唯一的,分组后每个组仅包含一行数据,apply(max)不会对数据产生任何筛选或修改,最终结果只是将原数据的索引替换为PUBLISH_TIME,完全不符合需求。
针对性解决方案
根据你的期望结果,实际需求应为保留DATE为2022-01-04的第一行,以及DATE为2022-01-05的所有行,对应代码如下:
# 筛选DATE为2022-01-04的第一行 part1 = df[df['DATE'] == '2022-01-04'].head(1) # 筛选DATE为2022-01-05的所有行 part2 = df[df['DATE'] == '2022-01-05'] # 合并并提取目标列 result = pd.concat([part1, part2])[['DATE', 'VALUE']].reset_index(drop=True)
执行后得到的结果与你的期望完全一致:
DATE VALUE 0 2022-01-04 490 1 2022-01-05 513 2 2022-01-05 527
补充:常见需求的解决方案
如果你的需求描述存在偏差,以下是几种常见场景的实现代码:
- 保留整个DataFrame中最新
PUBLISH_TIME对应的单行数据
df['PUBLISH_TIME'] = pd.to_datetime(df['PUBLISH_TIME']) latest_idx = df['PUBLISH_TIME'].idxmax() result = df.loc[latest_idx, ['DATE', 'VALUE']].to_frame().T.reset_index(drop=True)
结果:
DATE VALUE 0 2022-01-06 520
- 按
DATE分组,保留每个日期下最新PUBLISH_TIME对应的行
df['PUBLISH_TIME'] = pd.to_datetime(df['PUBLISH_TIME']) latest_per_date_idx = df.groupby('DATE')['PUBLISH_TIME'].idxmax() result = df.loc[latest_per_date_idx, ['DATE', 'VALUE']].reset_index(drop=True)
结果:
DATE VALUE 0 2022-01-04 504 1 2022-01-05 527 2 2022-01-06 520
- 按
DATE分组,保留每个日期下最早PUBLISH_TIME对应的行
df['PUBLISH_TIME'] = pd.to_datetime(df['PUBLISH_TIME']) earliest_per_date_idx = df.groupby('DATE')['PUBLISH_TIME'].idxmin() result = df.loc[earliest_per_date_idx, ['DATE', 'VALUE']].reset_index(drop=True)
结果:
DATE VALUE 0 2022-01-04 490 1 2022-01-05 513 2 2022-01-06 527
内容的提问来源于stack exchange,提问作者cmp
相关产品推荐
相关产品推荐

