Python 查找数据帧/2d数组中元组的行平均值

Python 查找数据帧/2d数组中元组的行平均值,python,pandas,Python,Pandas,我有一个二维阵列/熊猫数据帧,如下所示: a b c 0 (1, 2) (4, 4) (10, 12) 1 (11, 10) (44, 44) (5, 6) 我想找出元组形式的行平均值。 所需的输出将是: a b c avg 0 (1, 2) (4, 4) (10, 12) (5, 6) 1 (11, 10) (44, 44)

我有一个二维阵列/熊猫数据帧,如下所示:

          a         b         c
0    (1, 2)    (4, 4)  (10, 12)
1  (11, 10)  (44, 44)    (5, 6)
我想找出元组形式的行平均值。 所需的输出将是:

          a         b         c       avg
0    (1, 2)    (4, 4)  (10, 12)    (5, 6)
1  (11, 10)  (44, 44)    (5, 6)  (20, 20)

感谢单向使用
应用
灵感来源于
https://stackoverflow.com/questions/12412546/average-tuple-of-tuples

df['avg'] = df.apply(lambda x: tuple(map(np.mean, zip(*x))),axis=1)
另一种选择:

df.apply(lambda x: pd.DataFrame(x.tolist()).mean().round().agg(tuple),axis=1)

0      (5.0, 6.0)
1    (20.0, 20.0)
或者更好:

s  = df.stack()
df['avg'] = pd.DataFrame(s.tolist(),s.index).mean(level=0).round().agg(tuple,1)
print(df)

          a         b         c           avg
0    (1, 2)    (3, 4)  (10, 11)    (5.0, 6.0)
1  (12, 10)  (44, 44)    (5, 6)  (20.0, 20.0)

我会做两次
map

list(map(lambda x : tuple(map(np.mean, zip(*x))), df.values.tolist()))
[(4.666666666666667, 5.666666666666667), (20.333333333333332, 20.0)]

当然不是最好的方式,但只是为了好玩:

df['avg'] = (df.stack()
   .explode().astype(float)
   .reset_index(name='avg')
   .assign(group=lambda x: x.groupby(['level_0','level_1']).cumcount())
   .groupby(['level_0','group']).mean()
   .groupby(['level_0']).agg(tuple)
)

下面是一个有趣的基于
应用的解决方案

df['result'] = df.applymap(np.array).apply(np.mean, axis=1).map(tuple)                                                                  
df                                                                  

          a         b         c        result
0    (1, 2)    (4, 4)  (10, 12)    (5.0, 6.0)
1  (11, 10)  (44, 44)    (5, 6)  (20.0, 20.0)
不过,就性能而言,这并不是最好的。您可以反对使用apply,但无论如何,您不应该在列中存储元组。下面是一个使用列表理解的更快版本:

df['result'] = np.mean([
    [list(r_) for r_ in r] for r in df.values.tolist()], axis=1).tolist()                                           

df                                                                  
          a         b         c        result
0    (1, 2)    (4, 4)  (10, 12)    [5.0, 6.0]
1  (11, 10)  (44, 44)    (5, 6)  [20.0, 20.0]