将Pandas数据框转换为FDA函数型数据时遇重复值错误求助
解决Pandas转skfda FDataGrid时的重复值错误
错误原因
触发ValueError: Expect x to not have duplicates的直接原因是你传入的grid_points(即转成float后的列名)存在重复值。skfda.FDataGrid要求网格点必须唯一,因为每个网格点对应函数数据的一个维度,重复的网格点会导致维度定义冲突。
解决方案步骤
1. 定位重复列
先检查哪些列名转成float后出现重复:
# 转换列名为float并检测重复 float_columns = INV12_T.columns.astype(float) duplicate_mask = float_columns.duplicated(keep=False) duplicate_cols = INV12_T.columns[duplicate_mask] print("转成float后重复的列名:", duplicate_cols.tolist())
2. 处理重复列
根据重复原因选择对应处理方式:
- 若为数据录入错误(重复列数据一致):直接删除重复列,保留其中一列即可
# 保留第一次出现的列,删除后续重复列 INV12_T = INV12_T.loc[:, ~float_columns.duplicated()] - 若重复列数据不同(需保留所有数据):给重复列名添加后缀,确保转成float后唯一
from collections import defaultdict col_counter = defaultdict(int) new_columns = [] for col in INV12_T.columns: col_float = float(col) col_counter[col_float] += 1 if col_counter[col_float] > 1: new_columns.append(f"{col_float}_{col_counter[col_float]}") else: new_columns.append(str(col_float)) INV12_T.columns = new_columns
3. 创建FDataGrid并保留原列名
处理完重复列后,重新生成grid_points,并通过coordinate_names参数保留原列名标识:
# 提取原列名(如果添加了后缀,拆分出原始名称) original_col_names = [col.split('_')[0] for col in INV12_T.columns] # 生成无重复的网格点 grid_points = INV12_T.columns.astype(float) # 创建FDataGrid fd = skfda.FDataGrid( data_matrix=INV12_T, grid_points=grid_points, coordinate_names=original_col_names # 设置原列名为坐标标签 )
额外注意事项
如果重复列是因为时间戳重复(比如15分钟分辨率的时间点出现重复),建议先对时间维度的数据做聚合处理(如取均值、求和),确保每个时间点对应唯一的列,这比单纯修改列名更符合FDA数据的逻辑。
内容的提问来源于stack exchange,提问作者Monika
相关产品推荐
相关产品推荐

