numpy pandas中带条件的向量化计算

8cdiaqws  于 2023-04-06  发布在  其他
关注(0)|答案(2)|浏览(119)

我想有矢量计算,因为apply or df.iterrows()是缓慢的。下面的代码工作正常,给出预期的结果

import pandas as pd

df = pd.DataFrame({"a": [0, 12, 0, 5], "b": [5, 89, 45, 6], "c": [85, 23, 14, 10]})

def cal(data):
    val1 = data["a"]
    val2 = data["b"]
    val3 = data["c"]
        
    return val1+val2, val1-val2, val1*val3
df["add"], df["subract"], df["multiply"]  = cal(df)

    a   b   c   add subract multiply
0   0   5   85  5   -5      0
1   12  89  23  101 -77     276
2   0   45  14  45  -45     0
3   5   6   10  11  -1      50

现在我想让val 1,val 2,val 3 =0,只要dataframe中a列的任何一行是0。

def cal_with_zero(data):
    if data["a"] == 0:
        val1 = 0
        val2 = 0
        val3 = 0
    else:
        val1 = data["a"]
        val2 = data["b"]
        val3 = data["c"]
        
    return val1+val2, val1-val2, val1*val3

df["add"], df["subract"], df["multiply"]  = cal_with_zero(df)

代码行if data["a"] == 0:出错

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我想要的结果是

a   b   c   add subract multiply
0   0   5   85  0   0       0
1   12  89  23  101 -77     276
2   0   45  14  0   0       0
3   5   6   10  11  -1      50

我想有一个矢量化的方法,而不是apply or df.iterrows()。我想有函数cal_with_zero,因为在传递的 Dataframe 有很多条件,确定val 1的值,val 2,val 3在实际代码中,由于我无法使用np.where,可能是我错过了一些事情。
先谢谢你了!

vatpfxk5

vatpfxk51#

你可以使用numpy的where函数来实现这个. np.where很棒。你输入你的条件,然后当条件为真时你想要设置什么,然后当条件为假时你想要设置什么。对于你的情况。

import numpy as np

select_condition = df['a'] == 0

df['add'] = np.where(select_condition, 0, df['a'] + df['b'])
df['subtract'] = np.where(select_condition, 0, df['a'] - df['b'])
df['multiply'] = np.where(select_condition, 0, df['a'] * df['c'])

wko9yo5t

wko9yo5t2#

使用单个numpy.where子句:

df["add"], df["subract"], df["multiply"] = np.where(df['a'].eq(0), 0,
                                                    [df['a'] + df['b'], 
                                                     df['a'] - df['b'], 
                                                     df['a'] * df['c']])
a   b   c  add  subract  multiply
0   0   5  85    0        0         0
1  12  89  23  101      -77       276
2   0  45  14    0        0         0
3   5   6  10   11       -1        50

相关问题