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

12

我有几个数据框,它们的列和行索引相同。对于每个索引,我想要计算每列中值的平均值(如果这些是矩阵,我只需将它们相加并除以矩阵数量即可)。

以下是一个示例。

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')

但对于列数较多的大型数据框,这显然是低效的。那么我该如何在不使用循环的情况下实现这一点呢?


你仍然可以执行 (v1 + v2 + v3) / 3。Pandas 基于索引进行操作,顺序并不重要。另一种选择是面板pd.Panel({'v1': v1, 'v2': v2, 'v3': v3}).mean(axis=0),但我也会选择concat。 - ayhan
1个回答

33
你可以在连接数据帧后,对索引级别使用 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

1
我会给这个添加一个经验法则 - 总是优先使用内置的pandas函数进行求和,平均值等操作,因为它们已经经过了充分的性能优化。 - Shovalt
3
@Shovalt 我知道,这就是为什么我要求有人告诉我一个合适的解决方案。我的循环只是为了展示我尝试过什么。 - Salvador Dali
如何使用此方法避免丢失非数字列?即我有混合列值,希望只计算数值列的平均值? - CloudBalancing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接