是否有任何替代方案可以避免使用pandas.concat时出现"Reindexing only valid with uniquely valued Index objects"问题?
是否有任何替代方案可以避免使用pandas.concat时出现"Reindexing only valid with uniquely valued Index objects"问题?
希望你有个愉快的一天。
我的代码有一个问题,我需要合并不同的数据集,它们存储在一个名为all_csv
的列表中。问题是,这些数据集的结构如下:
数据集1 索引 设备1 GR03 1110 GR20 1121 *GR08* 1109 数据集2 索引 设备2 *GR08* 1112 GR01 1114 GR04 1123 (在代码中,索引是一个名为list1的列)
正如你所看到的,有时候索引可能是相同的(GR08)。所以我做了这个:
all_files = glob.glob(path + "/*data.csv") # 这个语句选择路径中所有的.csv文件 all_csv = [pd.read_csv(f, sep=',') for f in all_files] all_csv = [df.set_index(df["list1"]) for df in all_csv] #list1是上面显示的索引 all_csv = [df.drop(df.columns[0], axis=1) for df in all_csv] #删除重复项 df_merged = pd.concat(all_csv, axis=1) # 这里报错了 "只有唯一值索引对象才能重索引"
我知道使用concat函数时索引必须是相同的,所以我之前尝试过不设置索引来使用它,但是结果如下:
all_files = glob.glob(path + "/*data.csv") all_csv = [pd.read_csv(f, sep=',') for f in all_files] df_merged = pd.concat(all_csv, axis=1)
合并后的数据集如下:
索引 设备1 设备2 设备3 nan 1110 nan 1092 nan 1121 nan nan *GR08* 1109 1112 1098 nan nan 1114 nan nan nan 1123 1111
这是正确的,但是我不知道为什么在所有的数据集中没有连接的索引值会显示为nan。
有人有办法解决这个问题吗?或者有其他解决策略吗?
感谢你们所有人的回答。
问题的出现原因是在使用pandas.concat函数时,如果索引对象不是唯一值,会出现"Reindexing only valid with uniquely valued Index objects"的错误。解决方法是使用merge函数进行合并操作,可以通过设置参数how='outer'实现外连接,并指定on=['list1']进行列的合并。
具体的操作如下:
df1 list1 device1 0 GR03 1110 1 GR20 1121 2 *GR08* 1109 df2 list1 device2 0 *GR08* 1112 1 GR01 1114 2 GR04 1123 df1.merge(df2, how='outer', on=['list1']) list1 device1 device2 0 GR03 1110.0 NaN 1 GR20 1121.0 NaN 2 *GR08* 1109.0 1112.0 3 GR01 NaN 1114.0 4 GR04 NaN 1123.0
然而,由于df1、df2、df3等都存在于名为all_csv的列表中,所以无法直接使用上述方法。可以参考这个链接,该链接介绍了如何使用reduce函数对数据帧列表进行上述操作。