pd.melt在Python3.9运行正常,Python3.7报错,如何实现兼容?
解决pandas 1.1.5中melt()因id_vars与value_vars重叠报错的问题
问题根源是pandas 1.1.5及更早版本不允许id_vars和value_vars存在重叠列,而1.5.3版本已经修复了这个限制。要在Python3.7+pandas1.1.5环境下运行,需要先处理掉两者的重叠列,具体方案如下:
方案1:移除value_vars中的重叠列(推荐)
如果重叠列已经通过id_vars保留,不需要再作为值列参与melt,直接从value_vars中剔除交集列:
修改你的循环代码,在调用pd.melt()前先处理data_fields:
for idx in range(len(data_rows[0])): if idx == 0: continue data_fields = [row[idx] for row in data_rows] # 找出id_vars和value_vars的交集列 overlap_cols = set(key_fields) & set(data_fields) # 移除重叠列,得到干净的value_vars cleaned_value_vars = [col for col in data_fields if col not in overlap_cols] # 调用melt,使用处理后的value_vars melted_dfs.append(pd.melt( df, id_vars=key_fields, value_vars=cleaned_value_vars, var_name='variable' + str(idx), value_name=column_names[idx][0] ))
方案2:复制重叠列后再melt(如果需要保留重叠列作为值列)
如果确实需要把重叠列同时作为id列和值列处理,先复制这些列并命名为新列,再将新列加入value_vars:
for idx in range(len(data_rows[0])): if idx == 0: continue data_fields = [row[idx] for row in data_rows] overlap_cols = set(key_fields) & set(data_fields) # 复制重叠列,生成新列名(比如原列名+_copy) temp_df = df.copy() for col in overlap_cols: temp_df[f"{col}_copy"] = temp_df[col] # 替换value_vars中的重叠列为新列名 cleaned_value_vars = [ f"{col}_copy" if col in overlap_cols else col for col in data_fields ] # 调用melt melted_dfs.append(pd.melt( temp_df, id_vars=key_fields, value_vars=cleaned_value_vars, var_name='variable' + str(idx), value_name=column_names[idx][0] ))
选择哪种方案取决于你的业务需求:如果重叠列只需要作为标识列保留,用方案1;如果需要同时作为标识和值列,用方案2。
内容的提问来源于stack exchange,提问作者Ravindra
相关产品推荐
相关产品推荐

