具有相同列和索引的多个数据帧的平均值

时间:2016-08-14 09:37:55

标签: python pandas

我有一些数据帧。它们中的每一个都具有相同的列和相同的索引。对于每个索引,我想平均每列中的值(如果这些是矩阵,我只需将它们相加并除以矩阵的数量)。

以下是示例。

v1 = pd.DataFrame([['ind1', 1, 2, 3], ['ind2', 4, 5, 6]], columns=['id', 'c1', 'c2', 'c3']).set_index('id')
v2 = pd.DataFrame([['ind1', 2, 3, 4], ['ind2', 6, 1, 2]], columns=['id', 'c1', 'c2', 'c3']).set_index('id')
v3 = pd.DataFrame([['ind1', 1, 2, 1], ['ind2', 1, 1, 3]], columns=['id', 'c1', 'c2', 'c3']).set_index('id')

在实际情况中,索引和列可以按不同的顺序排列。

对于这种情况,结果将是

enter image description here

(ind1,c1的值为(1 + 1 + 2) / 3,对于ind2,c2为(1 + 5 + 1) / 3,依此类推。)

目前我使用循环执行此操作:

dfs = [v1, v2, v3]
cols= ['c1', 'c2', 'c3']

data = []
for ind, _ in dfs[0].iterrows():
    vals = [sum(df.loc[ind][col] for df in dfs) / float(len(dfs)) for col in cols]
    data.append([ind] + vals)

pd.DataFrame(data, columns=['id'] + cols).set_index('id')

,但对于包含大量列的大型数据帧来说,这显然效率低下。那么如何在没有循环的情况下实现这一目标呢?

1 个答案:

答案 0 :(得分:10)

连接数据帧后,您可以在index级别使用groupby.mean

pd.concat([v1, v2, v3]).groupby(level=0).mean()

            c1        c2        c3
id                                
ind1  1.333333  2.333333  2.666667
ind2  3.666667  2.333333  3.666667