如何对Pandas DataFrame按日期去重保留每日最新条目?
问题:保留每日最新的DataFrame条目
我每日从网站多次爬取数据,生成如下Pandas DataFrame:
import pandas as pd from pandas import Timestamp df=pd.DataFrame({ 'Tech en Innovation Fonds': {0: '63.57', 1: '63.57', 2: '63.57', 3: '63.57', 4: '61.03', 5: '61.03', 6: 61.03}, 'Aandelen Index Fonds': {0: '80.22', 1: '80.22', 2: '80.22', 3: '80.22', 4: '79.85', 5: '79.85', 6: 79.85}, 'Behoudend Mix Fonds': {0: '44.80', 1: '44.8', 2: '44.8', 3: '44.8', 4: '44.8', 5: '44.8', 6: 44.8}, 'Neutraal Mix Fonds': {0: '50.43', 1: '50.43', 2: '50.43', 3: '50.43', 4: '50.37', 5: '50.37', 6: 50.37}, 'Dynamisch Mix Fonds': {0: '70.20', 1: '70.2', 2: '70.2', 3: '70.2', 4: '70.04', 5: '70.04', 6: 70.04}, 'Risicomijdende Strategie': {0: '46.03', 1: '46.03', 2: '46.03', 3: '46.03', 4: '46.08', 5: '46.08', 6: 46.08}, 'Tactische Strategie': {0: '48.69', 1: '48.69', 2: '48.69', 3: '48.69', 4: '48.62', 5: '48.62', 6: 48.62}, 'Aandelen Groei Strategie': {0: '52.91', 1: '52.91', 2: '52.91', 3: '52.91', 4: '52.77', 5: '52.77', 6: 52.77}, 'Datum': {0: Timestamp('2022-07-08 18:00:00'), 1: Timestamp('2022-07-11 19:42:55'), 2: Timestamp('2022-07-12 09:12:09'), 3: Timestamp('2022-07-12 09:29:53'), 4: Timestamp('2022-07-12 15:24:46'), 5: Timestamp('2022-07-12 15:30:02'), 6: Timestamp('2022-07-12 15:59:31')}})
需求是清理DataFrame,仅保留每个日期的最新条目。比如示例中2022-07-12有5条数据,需保留最后一条(2022-07-12 15:59:31)。每月处理一次,每日会有多条数据。
尝试过以下代码,但因为时间不同,返回了所有记录,未能实现需求:
dfclean=df.sort_values('Datum').drop_duplicates('Datum', keep='last')
解决方案
原代码无效的核心原因是:Datum列包含完整时间戳(日期+时分秒),每个条目值唯一,drop_duplicates无法按日期维度去重。以下两种方法可以实现需求:
方法一:按日期分组筛选最新记录
先提取Datum的日期部分作为分组键,再保留每组内时间最晚的行:
# 先按时间戳排序,确保每组内顺序正确 df_sorted = df.sort_values('Datum') # 按日期分组,保留每组中时间最晚的条目 df_clean = df_sorted.groupby(df_sorted['Datum'].dt.date).last().reset_index(drop=True)
方法二:转换日期后去重
将Datum转换为日期格式作为去重依据,同时保留原时间戳的最新记录:
# 先按时间戳排序 df_sorted = df.sort_values('Datum') # 基于日期部分去重,保留每组最后一条 df_clean = df_sorted.drop_duplicates(subset=df_sorted['Datum'].dt.date, keep='last')
额外优化:统一数值列格式
注意到DataFrame中部分数值列存在字符串与数字混合的情况(如Tech en Innovation Fonds列),可以统一转换为数值类型:
# 遍历所有非Datum列,转换为float类型 for col in df.columns.drop('Datum'): df[col] = pd.to_numeric(df[col])
内容的提问来源于stack exchange,提问作者matje59
相关产品推荐
相关产品推荐

