首页 > 解决方案 > 对列进行分组和聚合会重复 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 

如何解决列倍增的问题?

标签: pythonpandas

解决方案


你有几个选择:

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

  2. reset_index 删除它:您可以使用它left_join.reset_index(drop=True)来丢弃索引列,而不是将它们添加到数据框中。默认情况下,reset_index 将当前索引列添加到数据框中,生成ValueError您获得的。


推荐阅读