gpt4 book ai didi

python - pandas "where"函数没有出现短路

转载 作者:太空宇宙 更新时间:2023-11-03 14:06:08 25 4
gpt4 key购买 nike

我可能误解了它是如何工作的。令我惊讶的是,考虑到这个数据框:

A   B      C            D
0 9.0 Nonnumeric 9.0
2 9.0 Num0a 9.0

这确实看起来短路(--好!):

dfzero["B"] = pd.DataFrame.where(
cond = dfzero["A"] != 0,
self = 1/dfzero["A"],
other = 0)

但这并不(--糟糕!):(给出除以零的错误,因为没有短路):

df["D"] = pd.DataFrame.where(
cond = df["C"].str.len() == 5,
self = df["C"].str[-2:].apply(lambda x: int(x, 16)),
other = 0)

错误是:

self = (df["C"].str[-2:].apply(lambda x: int(x, 16))),
ValueError: invalid literal for int() with base 16: 'ic'

最佳答案

不,即使第一种方法也不会短路。在计算结果之前,必须首先评估两个操作数。意思是,这是计算出来的,

i = dfzero["A"] != 0
i

0 False
1 True
Name: A, dtype: bool

这也是:

j = 1 / dfzero['A']
j

0 inf
1 0.500000
Name: A, dtype: float64

表达式实际上是:

pd.DataFrame.where(i, j, 0)

第二个也是一样。行为是一致的。

您是否期待 ZeroDivisionError ?你不会用 numpy 或 pandas 得到这个,因为这些库假设你在计算这些数量时知道自己在做什么。

<小时/>

此处的选择是预先计算掩码,然后仅计算这些行的结果。

m = df["C"].str.len() == 5
df['D'] = df.loc[m, 'C'].str[-2:].apply(lambda x: int(x, 16))

df

A B C D
0 0 9.0 Nonnumeric NaN
1 2 9.0 Num0a 10.0

如果您想填写 NaN,请使用 df.loc[~m, 'D'] = fill_value .

关于python - pandas "where"函数没有出现短路,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48877958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com