Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas:Any()All()和if/else_Python_Pandas - Fatal编程技术网

Python Pandas:Any()All()和if/else

Python Pandas:Any()All()和if/else,python,pandas,Python,Pandas,我试图在熊猫数据帧上执行一个简单的if/else语句。我得到的错误是序列的真值不明确。因此我尝试使用any()all()。使用这些选项只会导致表达式的if或else部分求值。我的数据如下所示: state district democrat republican totalvotes votestowin rwasted Maine 1 227546.0 164569.0 392115.0 196057.5 -

我试图在熊猫数据帧上执行一个简单的if/else语句。我得到的错误是序列的真值不明确。因此我尝试使用
any()all()
。使用这些选项只会导致表达式的
if
else
部分求值。我的数据如下所示:

state       district    democrat    republican  totalvotes  votestowin  rwasted
Maine       1           227546.0    164569.0    392115.0    196057.5    -31488.5
Maine       2           159081.0    192878.0    351959.0    175979.5     16898.5
Maryland    1           103622.0    242574.0    346196.0    173098.0    69476.0
Maryland    2           192183.0    102577.0    294760.0    147380.0    -44803.0
Maryland    3           214640.0    115048.0    329688.0    164844.0    -49796.0
我的代码是

for idx,row in data.iterrows():
    if (data['democrat'] >= data['republican']).all():
        data['rwasted'] = data['republican']
    else:
        data['rwasted'] = data['republican'] - data['votestowin']
您可以看到它只计算代码的
else
部分。有什么办法让它工作吗?为什么它首先返回一个错误呢?我觉得这句话很直白

你需要一个面具:

# Set a default value
data['rwasted'] = data['republican'] - data['votestowin']
# Find where it is different
mask = data['democrat'] >= data['republican']
# Set those rows to another value
data['rwasted'][mask] = data['republican']
不需要if-else语句,也不需要for循环。您必须考虑数据帧的行和列,而不是单元格。

您需要一个掩码:

# Set a default value
data['rwasted'] = data['republican'] - data['votestowin']
# Find where it is different
mask = data['democrat'] >= data['republican']
# Set those rows to another value
data['rwasted'][mask] = data['republican']
不需要if-else语句,也不需要for循环。您必须考虑数据帧的行和列,而不是像单元格一样。

.all()
是一个应用于整个
系列的函数,而不是单个
行的函数。你在这里混合了各种概念。要进行逐行比较(如您所愿):

请参阅@9769953的答案,以获得在数据帧中应用它的更简洁的方法,但这与您的
iterrows
方法类似。all()
是一个应用于整个
系列的函数,而不是单个
行的函数。你在这里混合了各种概念。要进行逐行比较(如您所愿):


请参阅@9769953的答案,以获得在数据帧中应用它的更简洁的方法,但这与您的
iterrows
方法类似

等式
data['democratic']>=data['republican']
对于数据帧中的几行来说不是
True
,因此
.all()
将计算为
False
。只有当公式适用于所有行时,它才是
真的
.all()
函数将检查整个数据帧中
民主党
的所有条目是否大于
共和党
。这不是您试图检查的内容请注意,您正在对这些行进行迭代,但是您没有单独使用这些行中的任何一行:循环的每次迭代,您都会访问完整的数据帧。您必须重新考虑如何使用数据帧,否则您将无法使用它们。您当前的循环表明您正在像dicts一样使用它们,而事实并非如此。@9769953谢谢您的解释。这真的帮助我了解了根本问题是什么!对于数据帧中的几行,等式
data['democratic']>=data['republican']
不是
True
,因此
。all()
将计算为
False
。只有当公式适用于所有行时,它才是
真的
.all()
函数将检查整个数据帧中
民主党
的所有条目是否大于
共和党
。这不是您试图检查的内容请注意,您正在对这些行进行迭代,但是您没有单独使用这些行中的任何一行:循环的每次迭代,您都会访问完整的数据帧。您必须重新考虑如何使用数据帧,否则您将无法使用它们。您当前的循环表明您正在像dicts一样使用它们,而事实并非如此。@9769953谢谢您的解释。这真的帮助我了解了根本问题是什么!强调数据帧的方法是按行和按列的,这绝对是一个好方法。我要注意的一件事是,
mask
这里是一个由布尔值组成的
pd.Series
,因为它可能对OPS来说不明显,这是有意义的。感谢您回答并解释它最初不起作用的原因:)很好地强调了处理数据帧的方法是按行和列进行的。我要注意的一件事是,
mask
这里是一个由布尔值组成的
pd.Series
,因为它可能对OPS来说不明显,这是有意义的。谢谢你回答和解释为什么它最初不起作用:)明白了,我明白了。谢谢你为它找到了工作的方法!明白了,我明白了。谢谢你为它找到了工作的方法!