Python 熊猫";其中;功能似乎没有短路
我可能误解了这是怎么回事。 我感到惊讶的是,考虑到这个数据框架:Python 熊猫";其中;功能似乎没有短路,python,pandas,dataframe,Python,Pandas,Dataframe,我可能误解了这是怎么回事。 我感到惊讶的是,考虑到这个数据框架: A B C D 0 9.0 Nonnumeric 9.0 2 9.0 Num0a 9.0 这确实出现短路(--良好!): 但这并不(--糟糕!): (由于不存在短路,因此给出了除零误差): 错误是: self = (df["C"].str[-2:].apply(lambda x: int(x, 16))), ValueError: invalid lite
A B C D
0 9.0 Nonnumeric 9.0
2 9.0 Num0a 9.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)
第二个也一样。这种行为是一贯的
您是否希望出现零错误
?使用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
谢谢,这很有意义,而且不要介意下面的警告:我通过复制到具有不同名称的新数据帧来摆脱它。这是可行的,但我得到了令人恐惧的设置WithCopyWarning(即使我使用的是.loc[row\u indexer,col\u indexer]):设置WithCopyWarning:试图在数据帧切片的副本上设置值。尝试改用.loc[row\u indexer,col\u indexer]=value
pd.DataFrame.where(i, j, 0)
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