pandas 将对象转换为字符串类型以进行比较

oaxa6hgo  于 2023-04-28  发布在  其他
关注(0)|答案(2)|浏览(168)

我正在阅读一个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)
y53ybaqx

y53ybaqx1#

编辑:以下是你更新后的错误:

def passfail_logic(row):
  if ((df3['subject'] == 'viva' & df3['marks'] ...

df3应该是row&应该是and,我不认为你想要这里的位运算符。我想这就是为什么你一直看到关于转换为字符串的东西,'viva' & df3['marks']这在计算中获得优先级,它不知道如何比较字符串('viva')到系列(df3['marks'])。您可以像(df3['subject]=='viva') & (df3['marks']=='...')一样将它们放在括号中,但也可以直接更改为and
df3[df3['c'] == 'Science']所做的基本上是将数据框过滤到列'c'为'Science'的任何行。所以你最终得到的是类似if([filtered dataframe])的东西,它不知道如何检查该语句的真实性。
我很难给予更多的信息,因为我不知道你想用“科学”数据做什么。
如果你只是想抓取过滤后的数据,那么你可以做一些类似的事情

filtered_df = df3[df3['c'] == 'Science']

如果你想应用一个函数,其中列是科学,你可以这样做

def some_function(value):
  if value == 'Science':
    return 1
  else:
    return 0

df3['science'] = df3['c'].apply(some_function)
2ul0zpep

2ul0zpep2#

计数是否找到任何行以评估真实性。

if df3[df3['c'] == 'Science'].shape[0]:
    ...

相关问题