我可能误会了它的工作原理。
鉴于此数据框,我感到惊讶:

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)


但这不是(--BAD!):
(由于没有短路,因此除以零误差):

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 “哪里”功能似乎没有短路,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48877958/

10-12 22:15