Python Pandas:Any()All()和if/else
我试图在熊猫数据帧上执行一个简单的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 -
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来说不明显,这是有意义的。谢谢你回答和解释为什么它最初不起作用:)明白了,我明白了。谢谢你为它找到了工作的方法!明白了,我明白了。谢谢你为它找到了工作的方法!