通过汇总熊猫中的某些列来合并多个数据框

时间:2019-07-17 12:31:37

标签: pandas dataframe sum

给出三个数据框:

df1 = pd.DataFrame({'A': [5, 0], 'B': [2, 4], 'C': 'dog'})
df2 = pd.DataFrame({'A': [1, 1], 'B': [3, 3], 'C': 'dog'})
df3 = pd.DataFrame({'A': [2, 1], 'B': [5, 1], 'C': 'dog'})

如何通过将给定数据帧的子集的值相加来将它们组合到单个数据帧中,从而使结果变为:

pd.DataFrame({'A': [8, 2], 'B': [10, 8], 'C': 'dog'})

对于这个例子?我的问题是我也有相同但不能求和的列(例如此处的'C')。

2 个答案:

答案 0 :(得分:4)

如果数字值和字符串然后在sum的{​​{3}}列表之后的GroupBy.agg中按组的唯一值,则使用DataFrame的一种可能的解决方案:

f = lambda x: x.sum() if np.issubdtype(x.dtype, np.number) else ','.join(x.unique())
df = pd.concat([df1, df2, df3], keys=range(3)).groupby(level=1).agg(f)
print (df)
   A   B    C
0  8  10  dog
1  2   8  dog

如果可能,可以使用不同的值,例如catdog

df1 = pd.DataFrame({'A': [5, 0], 'B': [2, 4], 'C': 'dog'})
df2 = pd.DataFrame({'A': [1, 1], 'B': [3, 3], 'C': 'dog'})
df3 = pd.DataFrame({'A': [2, 1], 'B': [5, 1], 'C': ['cat','dog']})


f = lambda x: x.sum() if np.issubdtype(x.dtype, np.number) else ','.join(x.unique())
df = pd.concat([df1, df2, df3], keys=range(3)).groupby(level=1).agg(f)
print (df)
   A   B        C
0  8  10  dog,cat
1  2   8      dog

如果需要列表:

f = lambda x: x.sum() if np.issubdtype(x.dtype, np.number) else x.unique().tolist()
df = pd.concat([df1, df2, df3], keys=range(3)).groupby(level=1).agg(f)
print (df)
   A   B           C
0  8  10  [dog, cat]
1  2   8       [dog]

对于标量为非数字值的组合列表,请使用自定义函数:

def f(x):
    if np.issubdtype(x.dtype, np.number):
        return x.sum()
    else:
        u = x.unique().tolist()
        if len(u) == 1:
            return u[0]
        else:
            return u

df = pd.concat([df1, df2, df3], keys=range(3)).groupby(level=1).agg(f)
print (df)
   A   B           C
0  8  10  [dog, cat]
1  2   8         dog

答案 1 :(得分:0)

您可以执行以下操作:

df = df3.copy()
df[['A','B']] = df1[['A','B']]+df2[['A','B']]+df3[['A','B']]

根据需要提供以下输出:

:df

    A   B   C
0   8   10  dog
1   2   8   dog