You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:30:16