Ваш l oop перезаписывает целевые значения на каждой итерации, поэтому вы получаете только последнюю строку. Вам нужно сохранить эти значения в списке и ЗАТЕМ преобразовать их в фрейм данных.
Так что измените свой l oop на:
states = []
cases = []
for items in bsObj.find("table",{"class":"wikitable sortable"}).find_all('tr')[1:37]:
data = items.find_all(['th',{"align":"left"},'td'])
states.append(data[0].a.text)
cases.append( data[1].b.text)
columns = ['States','Cases']
tab = pd.DataFrame(list(zip(states, cases)),
columns =columns)
tab
Вывод:
States Cases
0 Lagos 8,177
1 FCT 1,489
2 Kano 1,182
эт c.