在列上进行分组和聚合会重复熊猫中的列

时间:2019-09-23 16:59:46

标签: python pandas

我正在将两个表left_tableright_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 

如何解决列加倍的问题?

2 个答案:

答案 0 :(得分:1)

您有两种选择:

  1. 不包含索引的csv存储:我想您正在使用to_csv方法将结果存储在csv中。默认情况下,它在生成的csv中包括索引列。您可以执行to_csv(index=False)以避免存储它们。

  2. 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)

停止获取“分组列”作为索引。