def decade_total_count(decade, name):
"""
sums up the number of births of the given
female baby `name` in a 10-year period
Parameters:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
decade ... starting year of the decade
name ... female name
... str
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"""
count = 0
for i in range(decade, decade 10):
yearly = females[(females['name']==name) & (females['year']==i)]['births'].item()
count = count yearly
return count
I'm trying to use the function above to get the number of births for any name in the data but my loop stops whenever there's a year that the name does not occur in. In that case, I get this value error:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
/var/folders/yf/s14dt13x11n82t5kg4260v800000gn/T/ipykernel_4325/1603862037.py in <module>
----> 1 total_count('Jennifer')
/var/folders/yf/s14dt13x11n82t5kg4260v800000gn/T/ipykernel_4325/1143784105.py in total_count(name)
42
43 for i in range(start, end, 10):
---> 44 counts.append(decade_total_count(i, name))
45
46 return counts
/var/folders/yf/s14dt13x11n82t5kg4260v800000gn/T/ipykernel_4325/1143784105.py in decade_total_count(decade, name)
15
16 for i in range(decade, decade 10):
---> 17 yearly = females[(females['name']==name) & (females['year']==i)]['births'].item()
18 count = count yearly
19
~/Desktop/anaconda3/lib/python3.9/site-packages/pandas/core/base.py in item(self)
329 if len(self) == 1:
330 return next(iter(self))
--> 331 raise ValueError("can only convert an array of size 1 to a Python scalar")
332
333 @property
ValueError: can only convert an array of size 1 to a Python scalar
How can I bypass the error and keep my loop going even for years that does not contain the given 'name' in my data? I've messed around with try
, except
, else
, and finally
clause but somehow it breaks my loop and just returns 0.
CodePudding user response:
Sorry but I don't have enough information about the variable female
.
Try this:
def decade_total_count(decade, name):
"""
sums up the number of births of the given
female baby `name` in a 10-year period
Parameters:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
decade ... starting year of the decade
name ... female name
... str
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"""
count = 0
for i in range(decade, decade 10):
try:
yearly = females[(females['name']==name) & (females['year']==i)]['births'].item()
except ValueError:
continue
count = count yearly
return count
If a ValueError
is raised, just catch it and run next iteration.
CodePudding user response:
You haven't shown what you've tried, so I don't know where you're going wrong exactly. However, putting a try-except block within the loop should do the trick:
def decade_total_count(decade, name):
"""
sums up the number of births of the given
female baby `name` in a 10-year period
Parameters:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
decade ... starting year of the decade
name ... female name
... str
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"""
count = 0
for i in range(decade, decade 10):
try:
yearly = females[(females['name']==name) & (females['year']==i)]['births'].item()
count = count yearly
except ValueError as e:
print(f"Encountered error: {e}. Skipping.")
return count