处理DataFrame字典列表列时遇ValueError:无法在重复标签轴重索引
问题与解决方案
问题背景
我有一个DataFrame,其中data列的每行都是字典列表,数据时间范围覆盖2022-01-04至今日,每行包含约300个日期对应的数据点,示例结构如下:
0 [{'value': 18.76, 'date': '2022-01-04'}, {'val... 1 [{'value': 38.58, 'date': '2022-01-04'}, {'val... 2 [{'value': 37.5, 'date': '2022-01-04'}, {'valu... ...
此前使用以下代码可正常展开数据:
df[['date','value']] = df['data'].apply(lambda x: [[i['date'],i['value']] for i in x]).explode().apply(pd.Series, index=['date','value'])
但现在执行时触发错误:
ValueError: cannot reindex on an axis with duplicate labels
无法确定哪条日期存在重复,需要简便的排查与解决方法。
解决方案
1. 定位重复日期数据
先找出data列中存在重复日期的行,精准定位问题:
# 标记每行是否存在重复日期 df['has_duplicate'] = df['data'].apply( lambda lst: len({item['date'] for item in lst}) != len(lst) ) # 筛选出有重复的行 duplicate_rows = df[df['has_duplicate']] print("存在重复日期的行:") print(duplicate_rows) # 查看每行具体的重复日期 def extract_duplicate_dates(lst): date_counter = {} for item in lst: date = item['date'] date_counter[date] = date_counter.get(date, 0) + 1 return [date for date, count in date_counter.items() if count > 1] df['duplicate_dates'] = df['data'].apply(extract_duplicate_dates) print("\n每行重复的日期:") print(df[df['has_duplicate']]['duplicate_dates'])
2. 处理重复并展开数据
根据业务需求选择以下两种方式:
方式A:保留重复数据,规避索引错误
改用直接构造DataFrame的方式,跳过原方法的索引冲突问题:
# 先展开字典列表 exploded_df = df.explode('data').reset_index(drop=True) # 从字典中提取date和value字段 exploded_df[['date', 'value']] = exploded_df['data'].apply(pd.Series) # 可选:删除原data列 exploded_df = exploded_df.drop('data', axis=1)
方式B:去重后再展开
如果需要去除重复日期的数据,可先对每行的字典列表按日期去重(支持保留第一条/最后一条):
def deduplicate_by_date(lst, keep='last'): # 按date去重,保留最后一条或第一条 unique_dict = {} for item in lst: date = item['date'] if keep == 'last': unique_dict[date] = item elif keep == 'first': if date not in unique_dict: unique_dict[date] = item return list(unique_dict.values()) # 对每行的data列去重 df['data_deduped'] = df['data'].apply(deduplicate_by_date, keep='last') # 执行展开操作 df[['date','value']] = df['data_deduped'].apply(lambda x: [[i['date'],i['value']] for i in x]).explode().apply(pd.Series, index=['date','value']) # 可选:删除临时列 df = df.drop('data_deduped', axis=1)
内容的提问来源于stack exchange,提问作者neutralname
相关产品推荐
相关产品推荐

