How to solve a KeyError problem in Pandas

enter code here

           Gender   Value   Year    Measure
Name                
Ma         girl     0       1997    Rank
Nabiha     girl     1204    2014    Rank
Muad.      boy      1749    2009    Rank
Zynah      girl     4763    2017    Rank
Aathavi    girl     0       2019    Rank
Kia-Marie  girl     0       2017    Count
Tishaan    boy      0       2006    Rank
Ryyan      boy      0       2010    Count
Llyr       boy      1852    2012    Rank
Abdirazaq  boy      0       2017    Rank

The way that rank is calculated, I created a function so that those with s[‘Measure’] == "Count" and s[‘Value’] == 0 could be adjusted so they were ranked bottom not 0 as top value.

def adjust_rank(s):
    if s['Value'] == 0 & s['Measure'] == "Count":
        if s["Gender"] == "boy":
            s['Rank'] = 5000 # Bottom possible rank
        elif s["Gender"] == "girl":
            s['Rank'] = 3459 # Bottom possible rank
        else:
            s['Rank'] = s['Value']
df['Rank'] = df.apply(adjust_rank)

Why do I get: KeyError: ‘Value’?

>Solution :

Use numpy.select:

m = (df['Value'] == 0) & (df['Measure'] == "Count")
m1 = df["Gender"] == "boy"
m2 = df["Gender"] == "girl"

df['Rank'] = np.select([m & m1, m & m2, m & ~(m1 | m2)], 
                       [5000, 3459, df['Value']], default=None)

print (df)
          Gender  Value  Year Measure  Rank
Ma          girl      0  1997    Rank  None
Nabiha      girl   1204  2014    Rank  None
Muad.        boy   1749  2009    Rank  None
Zynah       girl   4763  2017    Rank  None
Aathavi     girl      0  2019    Rank  None
Kia-Marie   girl      0  2017   Count  3459
Tishaan      boy      0  2006    Rank  None
Ryyan        boy      0  2010   Count  5000
Llyr         boy   1852  2012    Rank  None
Abdirazaq    boy      0  2017    Rank  None

Or maybe need:

m = (df['Value'] == 0) & (df['Measure'] == "Count")
m1 = df["Gender"] == "boy"
m2 = df["Gender"] == "girl"

df['Rank'] = np.select([m & m1, m & m2], [5000, 3459], df['Value'])


print (df)
          Gender  Value  Year Measure  Rank
Ma          girl      0  1997    Rank     0
Nabiha      girl   1204  2014    Rank  1204
Muad.        boy   1749  2009    Rank  1749
Zynah       girl   4763  2017    Rank  4763
Aathavi     girl      0  2019    Rank     0
Kia-Marie   girl      0  2017   Count  3459
Tishaan      boy      0  2006    Rank     0
Ryyan        boy      0  2010   Count  5000
Llyr         boy   1852  2012    Rank  1852
Abdirazaq    boy      0  2017    Rank     0

Leave a Reply