代码之家  ›  专栏  ›  技术社区  ›  swifty

pandas-合并多个列并求和

  •  1
  • swifty  · 技术社区  · 8 年前

    我有一个主要的 df 就像这样:

    index   A  B  C
    5       1  5  8
    6       2  4  1
    7       8  3  4
    8       3  9  5
    

    还有一个助手 df2 我想在主数据框中添加如下内容:

    index   A  B  
    5       4  2 
    6       4  3 
    7       7  1 
    8       6  2 
    

    列A&B的名称相同,但主列 数据框 包含许多列, DF2型 没有。我想对常见的列求和,并保持其他列不变。

    输出:

    index   A  B  C
    5       5  7  8
    6       6  7  1
    7       15 4  4
    8       9  11 5
    

    尝试了 df.join 我是说, pd.merge groupby 但现在运气不好。

    最后一次尝试:

    df.groupby('index').sum().add(df2.groupby('index').sum())
    

    但这并没有保留公共列。

    PD.合并 我得到后缀 _x _y

    2 回复  |  直到 8 年前
        1
  •  2
  •   jezrael    8 年前

    使用 add 只有相同列 intersection 以下内容:

    c = df.columns.intersection(df2.columns)
    df[c] = df[c].add(df2[c], fill_value=0)
    print (df)
            A   B  C
    index           
    5       5   7  8
    6       6   7  1
    7      15   4  4
    8       9  11  5
    

    如果只使用 添加 ,不匹配的整数列转换为 float 学生:

    df = df.add(df2, fill_value=0)
    print (df)
            A   B    C
    index             
    5       5   7  8.0
    6       6   7  1.0
    7      15   4  4.0
    8       9  11  5.0
    

    编辑:

    如果可能,字符串公共列:

    print (df)
           A  B  C  D
    index            
    5      1  5  8  a
    6      2  4  1  e
    7      8  3  4  r
    8      3  9  5  w
    print (df2)
           A  B  C  D
    index            
    5      1  5  8  a
    6      2  4  1  e
    7      8  3  4  r
    8      3  9  5  w
    

    解决方案类似,仅按 select_dtypes 以下内容:

    c = df.select_dtypes(np.number).columns.intersection(df2.select_dtypes(np.number).columns)
    df[c] = df[c].add(df2[c], fill_value=0)
    print (df)
            A   B  C  D
    index              
    5       5   7  8  a
    6       6   7  1  e
    7      15   4  4  r
    8       9  11  5  w
    
        2
  •  0
  •   Sociopath    8 年前

    不是最干净的方法,但可能会奏效。

    df_new = pd.DataFrame()
    df_new['A'] = df['A'] + df2['A']
    df_new['B'] = df['B'] + df2['B']
    df_new['C'] = df['C']
    
    
    print(df_new)
    
        A   B  C
    0   5   7  8
    1   6   7  1
    2  15   4  4
    3   9  11  5