【问题标题】:Pandas groupby and weighted sum for multiple columnsPandas groupby和多列的加权和
【发布时间】:2020-04-28 14:02:51
【问题描述】:

我已经看到了十几个 Pandas groupby 多列问题,但我不知道如何让它在合理的时间内运行。我的目标是对几列进行分组,并使用生成的子集将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

【问题讨论】:

    标签: python pandas numpy group-by pandas-groupby


    【解决方案1】:

    怎么样...

    (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 的假设下工作的。

    【讨论】:

    • 你的意思是len(df.groupby([...]) % len(weights) == 0吗?在我的真实数据中,我有 10k 次模拟,其中每个分组的长度与我的权重相同。
    • @Tony 基本上每个组都应该有一个 行,是的。假设您只有一组权重。如果您有多个权重,对于每个组,您可以将它们连接为一个(确保连接的结果长度等于 len(df))而不是平铺。
    猜你喜欢
    • 2021-11-01
    • 2019-12-26
    • 1970-01-01
    • 2021-05-30
    • 2020-11-05
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2019-09-29
    相关资源
    最近更新 更多