使用平均值合并Pandas中的数据帧

2024-04-18 11:27:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一组带有数值和部分重叠索引的数据帧。如果索引出现在多个数据帧中,我希望将它们合并为take-mean。

import pandas as pd
import numpy as np

df1 = pd.DataFrame([1,2,3], columns=['col'], index=['a','b','c'])
df2 = pd.DataFrame([4,5,6], columns=['col'], index=['b','c','d'])

这给了我两个数据帧:

   col            col
a    1        b     4
b    2        c     5
c    3        d     6

现在,我想合并数据帧并取每个索引的平均值(如果适用,即如果它出现不止一次)。

应该是这样的:

    col
a     1
b     3
c     4
d     6

我可以用一些高级合并/加入来完成吗?


Tags: columns数据importnumpydataframepandasindexas
3条回答

像这样的:

df3 = pd.concat((df1, df2))
df3.groupby(df3.index).mean()

#    col
# a    1
# b    3
# c    4
# d    6

或其他方式,如@unutbu回答:

pd.concat((df1, df2), axis=1).mean(axis=1)
In [22]: pd.merge(df1, df2, left_index=True, right_index=True, how='outer').mean(axis=1)
Out[23]: 
a    1
b    3
c    4
d    6
dtype: float64

关于Roman的问题,我发现IPython%timeit命令是一种方便的基准代码方法:

In [28]: %timeit df3 = pd.concat((df1, df2)); df3.groupby(df3.index).mean()
1000 loops, best of 3: 617 µs per loop

In [29]: %timeit pd.merge(df1, df2, left_index=True, right_index=True, how='outer').mean(axis=1)
1000 loops, best of 3: 577 µs per loop

In [39]: %timeit pd.concat((df1, df2), axis=1).mean(axis=1)
1000 loops, best of 3: 524 µs per loop

在这种情况下,pd.concat(...).mean(...)会快一点。但实际上,我们应该测试更大的数据帧,以获得更有意义的基准。

顺便说一下,如果不想安装IPython,可以使用Python's ^{} module运行等效的基准测试。只是需要更多的设置。显示如何执行此操作的docs has some examples


注意,如果df1df2在其索引中有重复项,例如:

N = 1000
df1 = pd.DataFrame([1,2,3]*N, columns=['col'], index=['a','b','c']*N)
df2 = pd.DataFrame([4,5,6]*N, columns=['col'], index=['b','c','d']*N)

然后这三个答案给出了不同的结果:

In [56]: df3 = pd.concat((df1, df2)); df3.groupby(df3.index).mean()
Out[56]: 
   col
a    1
b    3
c    4
d    6

pd.merge可能没有给出您想要的答案:

In [58]: len(pd.merge(df1, df2, left_index=True, right_index=True, how='outer').mean(axis=1))
Out[58]: 2002000

pd.concat((df1, df2), axis=1)引发值错误时:

In [48]: pd.concat((df1, df2), axis=1)
ValueError: cannot reindex from a duplicate axis

相关问题 更多 >