如何为Pandas DataFrame补全2023年缺失日期?解决重复标签报错
解决DataFrame补全年日期时的重复索引报错问题
报错原因
原DataFrame将eventDate设为索引后,索引存在重复值(如2023-01-01出现两次),而reindex方法要求原索引必须唯一,因此触发ValueError: cannot reindex on an axis with duplicate labels。
解决方案
方法一:外连接合并全日期与原数据
通过创建包含2023全年日期的DataFrame,与原数据做外连接,既能保留原数据的所有行,又能补全缺失日期的空行:
import pandas as pd # 原数据 data = {"eventDate":["2023-01-01", "2023-01-01", "2023-12-10"], "col1":[1,2,3], "col2":["a","b","c"]} df = pd.DataFrame(data) df["eventDate"] = pd.to_datetime(df["eventDate"]) # 创建2023年所有日期的DataFrame full_dates = pd.DataFrame({"eventDate": pd.date_range("2023-01-01", "2023-12-31")}) # 外连接合并,保留所有日期和原数据的重复行 result = pd.merge(full_dates, df, on="eventDate", how="outer") # 按日期排序并重置索引 result = result.sort_values("eventDate").reset_index(drop=True) print(result.head())
方法二:分组展开后合并
先按日期分组保留所有行,消除索引重复后再与全日期索引合并:
import pandas as pd data = {"eventDate":["2023-01-01", "2023-01-01", "2023-12-10"], "col1":[1,2,3], "col2":["a","b","c"]} df = pd.DataFrame(data) df["eventDate"] = pd.to_datetime(df["eventDate"]) # 创建全日期索引 idx = pd.date_range("2023-01-01", "2023-12-31") # 按日期分组展开,消除索引重复 grouped = df.groupby("eventDate").apply(lambda x: x.reset_index(drop=True)).unstack(level=1) grouped = grouped.stack().reset_index(level=1, drop=True) # 重索引补全日期 result = grouped.reindex(idx).reset_index().rename(columns={"index": "eventDate"}) print(result.head())
两种方法最终都能生成包含2023全年日期的DataFrame:原数据的重复行完整保留,缺失日期的行自动填充NaN。
内容的提问来源于stack exchange,提问作者Bera
相关产品推荐
相关产品推荐

