“where”函数似乎没有短路

2024-10-03 02:45:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我可能误解了这是怎么回事。 我很惊讶,考虑到这个数据帧:

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

这看起来确实短路了(-GOOD!)地址:

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'

Tags: 数据lambdaselfdataframedfwhereintpd
1条回答
网友
1楼 · 发布于 2024-10-03 02:45:18

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

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。你知道吗

相关问题 更多 >