[英]Pandas groupby and weighted sum for multiple columns
我已经看到十几个 Pandas groupby 多列问题,但我不知道如何在合理的时间内运行它。 我的目标是对几列进行np.dot
,并根据我的权np.dot
每个剩余的列中应用np.dot
生成的子集:
# Example data:
weights = np.array([.20, .60, .20])
data = pd.DataFrame([[0, "TX", 10, 55], [0, "TX", 5, 30], [0, "TX", 2, 75], [1, "TX", 4, 30], [1, "TX", 8, 100], [1, "TX", 2, 30]], columns=["sim", "state", "x1", "x2"])
print(data)
sim state x1 x2
0 0 TX 10 55
1 0 TX 5 30
2 0 TX 2 75
3 1 TX 4 30
4 1 TX 8 100
5 1 TX 2 30
我无法让np.dot
开箱即用,所以我不得不将乘法和求和分解为单独的步骤。 这是我尝试过的,但在我的几百万行数据集上,这需要大约 2 分钟,更不用说非常不可读了:
results = data.groupby(["sim", "state"]).apply(lambda sdf: (sdf[["x1", "x2"]] * weights.reshape((3,1))).sum())
print(results.reset_index())
sim state x1 x2
0 0 TX 5.4 44.0
1 1 TX 6.0 72.0
怎么样...
(df.set_index(['sim', 'state'])
.mul(np.tile(weights, len(df) // len(weights)), axis=0)
.sum(level=[0, 1]))
x1 x2
sim state
0 TX 5.4 44.0
1 TX 6.0 72.0
这是如何运作的,
df
的主键)mul
与权重执行广播乘法 这是在len(df) % len(weights) == 0
的假设下工作的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.