为什么我不能在我的函数中为pandas数据帧分配值?

时间:2018-04-04 20:26:13

标签: python pandas dataframe

我有一个名为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.我知道那里有一个更优雅的解决方案,但我还是想知道为什么这样做/不起作用。)

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 ...