[英]Find row average of tuples in data frame / 2d array
我有一个二维数组/熊猫数据框,如下所示:
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
启发的apply
一种方法
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)
)
这是一个有趣的基于apply
的解决方案。
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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.