是否有任何替代方案可以避免使用pandas.concat时出现"Reindexing only valid with uniquely valued Index objects"问题?

10 浏览
0 Comments

是否有任何替代方案可以避免使用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。

有人有办法解决这个问题吗?或者有其他解决策略吗?

感谢你们所有人的回答。

0
0 Comments

问题的出现原因是在使用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函数对数据帧列表进行上述操作。

0