我正在阅读一个csv文件并将其内容写入一个dataframe。
df1 = pd.read_csv(r'/C:/Data.csv', sep=',', names=["a", "b", "c"])
我稍后将一列中的数据与另一个数据框中的列进行比较。代码执行失败,显示错误'('The truth value of a Series is ambiguous. Use a.empty,a.bool(),a.item(),a.any()or a.all().',u'occurred at index 0')'。
他们已经尝试过使用不同版本的astype方法,但到目前为止还没有任何效果。下面粘贴了一段我尝试过的代码,也没有效果。
if (df3[df3['c'] == 'Science']):
如果有人能帮助我理解这个问题并解决它,我将不胜感激。
为了更好地理解,添加下面的代码...
df1 = --reading from local(id, student name, class columns)
df2 = --creating this to save the output from the json method(id, subject, marks)
url = --endpoint
def passfail_logic(row):
if ((df3['subject'] == 'viva' & df3['marks'] > 85 ) & (df3['subject'] == 'science' & df3['marks'] > 75) & (df3['subject'] == 'math' & df3['marks'] > 85) ):
res = 'pass'
elif ((df3['subject'] == 'viva' & df3['marks'] > 50 ) & (df3['subject'] == 'science' & df3['marks'] > 45) & (df3['subject'] == 'math' & df3['marks'] > 55)) :
res = 'reattempt'
else:
res = 'fail'
return res
testdata = open('/c:/TestData.csv')
testdataReader = csv.reader(testdata)
testdatalist = list(testdataReader)
for row in testdatalist:
j = "{'id':" + row[0] + ",'student_name':" + row[1] + ",'class':'" + row[2] + "'}"
j = j.replace("'",'"')
j = ast.literal_eval(j)
response = requests.post(url, json=j)
df2 = df2.append(response.json(), ignore_index=True)
df4 = pd.concat([df1, df2], axis=1)
df3['result'] = df3.apply(lambda row : passfail_logic(row ), axis = 1)
df3.to_csv('C:/StudentResult.csv', index=False)
2条答案
按热度按时间y53ybaqx1#
编辑:以下是你更新后的错误:
df3
应该是row
,&
应该是and
,我不认为你想要这里的位运算符。我想这就是为什么你一直看到关于转换为字符串的东西,'viva' & df3['marks']
这在计算中获得优先级,它不知道如何比较字符串('viva'
)到系列(df3['marks']
)。您可以像(df3['subject]=='viva') & (df3['marks']=='...')
一样将它们放在括号中,但也可以直接更改为and
df3[df3['c'] == 'Science']
所做的基本上是将数据框过滤到列'c'为'Science'的任何行。所以你最终得到的是类似if([filtered dataframe])的东西,它不知道如何检查该语句的真实性。我很难给予更多的信息,因为我不知道你想用“科学”数据做什么。
如果你只是想抓取过滤后的数据,那么你可以做一些类似的事情
如果你想应用一个函数,其中列是科学,你可以这样做
2ul0zpep2#
计数是否找到任何行以评估真实性。