【问题标题】:Increase value of several rows based on condition fulfilling all rows根据满足所有行的条件增加几行的值
【发布时间】:2019-11-07 02:48:15
【问题描述】:

我有一个包含三列的 pandas 数据框,并且希望将每行的浮点数乘以/增加相同的数量,直到所有三个单元格(一行)的总和满足标准(值等于或大于 0.9)

df = pd.DataFrame({'A':[0.03, 0.0, 0.4],
               'B': [0.1234, 0.4, 0.333],
               'C': [0.5, 0.4, 0.0333]})

结果: 每行中的不同单元格相乘,使得每行的所有三个单元格的总和为 0.9(每行的总和并不完全是 0.9,因为我试图通过简单的乘法来接近,因此实际结果将达到 0.9) .重要的是,为 0 的单元格将保持为 0。

print (df)
A         B         C
0  0.0414  0.170292  0.690000
1  0.0000  0.452000  0.452000
2  0.4720  0.392940  0.039294

【问题讨论】:

    标签: python python-3.x pandas loops dataframe


    【解决方案1】:

    您想沿行应用缩放函数:

    def scale(xs, target=0.9):
        """Scale the features such that their sum equals the target."""
        xs_sum = xs.sum()
        if xs_sum < target:
            return xs * (target / xs_sum)
        else:
            return xs
    
    df.apply(scale), axis=1)
    

    例如:

    df = pd.DataFrame({'A':[0.03, 0.0, 0.4],
                       'B': [0.1234, 0.4, 0.333],
                       'C': [0.5, 0.4, 0.0333]})
    df.apply(scale, axis=1)
    

    应该给:

              A         B         C
    0  0.041322  0.169972  0.688705
    1  0.000000  0.450000  0.450000
    2  0.469790  0.391100  0.039110
    

    该数据框的行总和为 0.9:

    df.apply(scale), axis=1).sum(axis=1)
    
    0    0.9
    1    0.9
    2    0.9
    dtype: float64
    

    【讨论】:

    • @Marijn van Vliet 它适用于总和小于 0.9 的所有行,但对于总和超过 0.9 的单元格,它也改变了它们。我怎么能只对 A、B、C 列低于 0.9 的行执行操作?
    • 缩放功能可以是任何你想要的。我用一个简单的 if 语句更新了我的答案,以检查总和是否低于 0.9(作为参数提供的值)
    • 完美,成功了。由于我对缩放没有经验,我能否要求最后一点如何仅缩放我指定的列(A 到 C),因为我刚刚意识到我还有其他不想缩放的列。谢谢
    • df[['A', 'B', 'C']].apply(scale, axis=1)
    • 如果此答案解决了您的问题,您能否将其标记为您的问题和我的答案的未来读者?
    【解决方案2】:

    您可以对 axis=1 求和,然后用 0.9 减去,然后用 df.shape[1] 除以将其加回:

    df.add((0.9-df.sum(axis=1))/df.shape[1],axis=0)
    

             A         B         C
    0  0.112200  0.205600  0.582200
    1  0.033333  0.433333  0.433333
    2  0.444567  0.377567  0.077867
    

    【讨论】:

    • Cell A1 现在的值大于 0 (0.333),这是我不想要的。我在考虑更多关于将每一行相乘以使 0 保持为 0 的循环。
    • 我稍微澄清了这个问题:每行中的不同单元格相乘,使得每行的所有三个单元格的总和为0.9(每行的总和并不完全是0.9,因为我试图来用简单的乘法关闭,因此实际结果将达到 0.9)。重要的是,为 0 的单元格将保持为 0。
    • 我不希望为0的单元格增加,所以代码应该相乘而不是相加。
    • @ManuH 我明白了,现在,当你有矢量化解决方案时,循环很糟糕,可能试试df.mul(0.9/df.sum(axis=1),axis=0)。专门描述第一个 tme 会避免这些评论链
    • 我重新提问并提供了更多细节:stackoverflow.com/questions/56757624/…
    猜你喜欢
    • 2021-05-15
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 2017-09-16
    相关资源
    最近更新 更多