我可能误会了它的工作原理。
鉴于此数据框,我感到惊讶:
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/