我正在将两个表left_table
和right_table
连接到非唯一键上,这会导致行爆炸。然后,我想聚合行以匹配left_table
中的行数。为此,我聚合了left_table列。
奇怪的是,当我保存表格时,left_table
中的列会加倍。似乎left_table
的列已成为结果数据帧的索引...
左表
k1 k2 s v c target
0 1 3 20 40 2 2
1 1 2 10 20 1 1
2 1 2 10 80 2 1
右边的桌子
k11 k22 s2 v2
0 1 2 0 100
1 2 3 30 200
2 1 2 10 300
左加入
k1 k2 s v c target s2 v2
0 1 3 20 40 2 2 NaN NaN
1 1 2 10 20 1 1 0.0 100.0
2 1 2 10 20 1 1 10.0 300.0
3 1 2 10 80 2 1 0.0 100.0
4 1 2 10 80 2 1 10.0 300.0
聚合代码
dic = {}
keys_to_agg_over = left_table_col_names
for col in numeric_cols:
if col in all_cols:
dic[col] = 'median'
left_join = left_join.groupby(keys_to_agg_over).aggregate(dic)
聚合后(左侧表列数增加一倍)
k1 k2 s v c target s2 v2
k1 k2 s v c target
1 2 10 20 1 1 1 2 10 20 1 1 5.0 200.0
80 2 1 1 2 10 80 2 1 5.0 200.0
3 20 40 2 2 1 3 20 40 2 2 NaN NaN
保存到csv文件
k1,k2,s,v,c,target,k1,k2,s,v,c,target,s2,v2
1,2,10,20,1,1,1,2,10,20,1,1,5.0,200.0
1,2,10,80,2,1,1,2,10,80,2,1,5.0,200.0
1,3,20,40,2,2,1,3,20,40,2,2,,
我尝试将索引重置为left_join.reset_index()
,但我得到了
ValueError: cannot insert target, already exists
如何解决列加倍的问题?
答案 0 :(得分:1)
您有两种选择:
不包含索引的csv存储:我想您正在使用to_csv
方法将结果存储在csv中。默认情况下,它在生成的csv中包括索引列。您可以执行to_csv(index=False)
以避免存储它们。
reset_index删除它:您可以使用left_join.reset_index(drop=True)
来丢弃索引列而不将其添加到数据框中。默认情况下,reset_index将当前索引列添加到数据帧,从而生成您获得的ValueError
。
答案 1 :(得分:0)
似乎您正在使用:
left_join = left_table.merge(right_table, left_on = ["k1", "k2"], "right_on" = ["k11", "k22"] , how = "left")
这将导致数据帧具有重复的行,因为来自左表的索引1和2都可以连接到右表的索引0和2。如果这是您期望的行为,并且只想摆脱重复的行,则可以尝试使用:
left_join = left_join.drop_duplicates()
汇总之前。此解决方案不会停止重复行,而是会消除行而不造成任何麻烦。
您还可以像这样在groupby函数中传递参数as_index = False:
left_join = left_join.groupby(keys_to_agg_over, as_index = False).aggregate(dic)
停止获取“分组列”作为索引。