【问题标题】:How to make a calculation in a pandas daframe depending on a value of a certain column如何根据特定列的值在熊猫数据框中进行计算
【发布时间】:2023-01-10 17:03:18
【问题描述】:

我有这个数据框,我想根据条件进行计算,如下所示:

   count  prep  result
     0      10     100
    10      100    100

我想创建一个新列 evaluated 即:

if df['count']==0: 
    df['evaluated'] = df['result'] / df['prep']
else:
    df['evaluated'] = df['result'] / df['count']

预期结果是:

   count  prep  result   evaluated
     0      10     100      10
    100     10     100      1

最好的方法是什么?我的真实数据框有 30k 行。

【问题讨论】:

  • 提供的示例还显示了“准备”的变化,鉴于您的描述,我认为这是不正确的,否则请澄清。

标签: python-3.x pandas


【解决方案1】:

您可以使用wheremask

df['evaluated'] = df['result'].div(df['prep'].where(df['count'].eq(0), df['count']))

或者:

df['evaluated'] = df['result'].div(df['count'].mask(df['count'].eq(0), df['prep']))

输出(假设提供的输入有误):

   count  prep  result  evaluated
0      0    10     100       10.0
1    100    10     100        1.0

【讨论】:

    【解决方案2】:

    除了 mozway 的答案,计算不等于 0 的值的评估:df['evaluated'] = df['result'].div(df['prep'].where(df['count'].ne(0), df['count']))

    【讨论】:

      【解决方案3】:

      您还可以使用 numpy 中的 np.where 来做到这一点:

      df['evaluated'] = np.where(df['count'] == 0,
                                 df['result'] / df['prep'],   # == 0
                                 df['result'] / df['count'])  # != 0
      

      超过 30k 行的性能(不是很重要):

      >>> %timeit df['result'].div(df['prep'].where(df['count'].eq(0), df['count']))
      652 µs ± 12.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
      
      >>> %timeit df['result'].div(df['count'].mask(df['count'].eq(0), df['prep']))
      638 µs ± 1.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
      
      >>> %timeit np.where(df['count'] == 0, df['result'] / df['prep'], df['result'] / df['count'])
      462 µs ± 1.63 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-11
        • 2015-08-09
        • 2020-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-22
        • 2015-01-28
        相关资源
        最近更新 更多