使用if-else创建新列时的Pandas错误:Series的真值是不明确的

sta*_*010 2 python pandas

我正在使用Pandas并尝试使用Python if-else语句(也称为三元条件运算符)创建一个新列,以避免被零除.

例如下面,我想通过划分A/B来创建一个新的列C. 我想使用if-else语句来避免除以0.

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0, 5, size=(100, 2)), columns=list('AB'))
df.head()
#    A  B
# 0  1  3
# 1  1  2
# 2  0  0
# 3  2  1
# 4  4  2

df['C'] = (df.A / df.B) if df.B > 0.0 else 0.0
Run Code Online (Sandbox Code Playgroud)

但是,我从最后一行收到错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Run Code Online (Sandbox Code Playgroud)

我在StackOverflow上搜索并发现了有关此错误的其他帖子,但它们都没有涉及这种类型的if-else语句.一些帖子包括:

系列的真值是模棱两可的.使用a.empty,a.bool(),a.item(),a.any()或a.all()

系列的真值在数据帧中是模糊的

错误:系列的真值是不明确的 - Python pandas

任何帮助,将不胜感激.

kee*_*ive 12

做什么

>>> df['C'] = np.where(df.B>0., df.A/df.B, 0.)
Run Code Online (Sandbox Code Playgroud)

读作:

在哪里df.B严格肯定,返回df.A/df.B,否则返回0.

  • 谢谢.我认为`np.where()`应该重命名为:`np.if_then_else(if,then,else)`. (4认同)

Ale*_*der 5

df.B > 0 results in a Series, e.g.:

0      True  # 4 > 0 => True
1      True  # 2 > 0 => True
2      True  # ...
3      True
4      True
5      True
6      True
7      True
8     False  # 0 is not > 0 => False
9     False  # 0 is not > 0 => False
...
Run Code Online (Sandbox Code Playgroud)

Multiple values are returned which results in ambiguity (some are True while others are False).

One solution is to use np.where:

sentinel = np.nan  # Or 0 if you must...
df = df.assign(C=np.where(df['B'] != 0, df['A'] / df['B'], sentinel))
>>> df
   A  B    C
0  2  4  0.5
1  0  2  0.0
2  1  2  0.5
3  4  4  1.0
4  1  1  1.0
5  4  4  1.0
6  2  4  0.5
7  1  2  0.5
8  4  0  NaN  # NaN is assigned in cases where the value in Column `B` is zero.
9  1  0  NaN
...
Run Code Online (Sandbox Code Playgroud)