我有一个名为fresp的数据框,在命令行中我可以这样做:
for i in range(0,len(fresp)):
num=fresp.at[i,'caseid']
这很好用。完全相同的代码,当保存在.py文件中时,会给我:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
具体参考num = fresp.at [i,' caseid']。
这是整个功能。当我将它保存在.py文件中时,导入该函数并运行它,我收到错误。当我把整个东西复制到命令行(减去然后第一个def行)时,它运行得很好。为什么会这样?
def ValidatePregs(df,fresp):
pregmap=MakePregMap(df)
counter=0
for i in range(0,len(fresp)):
case=fresp.at[i,'caseid']
num=fresp.at[i,'pregnum']
if num == 0 and case in pregmap:
print("Mismatch for "+case+".")
counter +=1
elif num != len(pregmap[case]):
print("Mismatch for "+case+".")
counter +=1
if counter==0:
print("No mismatches!")
(我正在阅读/做Allen B. Downey的Think Stats 2.0.35。我正在练习练习1.我知道那里有一个更优雅的解决方案,但我还是想知道为什么这样做/不起作用。)
答案 0 :(得分:1)
我想我知道你的问题: 在这些方面:
num=fresp.at[i,'pregnum']
if num == 0 and case in pregmap:
您尝试使用与at
类似的loc
来获取行,并返回pd.Series
个对象。当你进行比较时,Python正在比较具有模糊真值的pd.Series
。
为避免这种情况,您可以使用iloc
获取行,然后访问pregnum
值:
num = fresp.iloc[i].pregnum
if num ...