如何在Pandas DataFrame中保留指定日期后的行?解决KeyError报错
解决Pandas DataFrame按日期过滤行的KeyError问题
问题原因
你当前的drop()用法有误:drop()方法需要传入行索引(axis=0)或列名(axis=1)作为要删除的标签,而你直接传入了一个子DataFrame。这会导致Pandas误将子DataFrame的列名当作要删除的标签,从而抛出KeyError。另外,pd.read_csv()返回的已经是DataFrame,无需再用pd.DataFrame()转换,这一步属于冗余操作。
正确实现方法
方法1:布尔索引(推荐,简洁高效)
直接筛选出date列大于等于"2014-10-26"的行,这是Pandas中过滤行的标准做法:
import pandas as pd # 读取数据(read_csv直接返回DataFrame) dataset = pd.read_csv("charts.csv") # 推荐:将date列转换为datetime类型,确保日期比较逻辑准确 dataset['date'] = pd.to_datetime(dataset['date']) # 筛选符合条件的行 dataset = dataset[dataset['date'] >= "2014-10-26"]
方法2:使用drop()(若坚持用此方法)
如果一定要用drop(),需要传入要删除的行的索引:
import pandas as pd dataset = pd.read_csv("charts.csv") dataset['date'] = pd.to_datetime(dataset['date']) # 获取需要删除的行的索引(日期早于2014-10-26的行) rows_to_drop = dataset[dataset['date'] < "2014-10-26"].index # 删除指定索引的行 dataset = dataset.drop(rows_to_drop)
额外说明
- 转换
date列为datetime类型是良好实践:虽然YYYY-MM-DD格式的字符串比较也能生效,但转换后可支持更复杂的日期操作(如按月份筛选、计算日期差等)。 - 对于8万行的DataFrame,布尔索引的性能优于
drop(),因为它直接生成新的DataFrame,无需额外的索引查找操作。
内容的提问来源于stack exchange,提问作者KurtosisCobain
相关产品推荐
相关产品推荐

