0

I have a dataframe df that look like:

Quarter Body    Deadline missed Deadline met Ratio
2019_Q3    A                  2            2
2019_Q3    B                 10            9
2019_Q3    C                 39           39
2019_Q3    D                  5            5
2019_Q3    E                  0           16
2019_Q3    F                  4            4
2019_Q3    G                 12           12
2019_Q3    H                  1            0
2019_Q3    I                 13           12
2019_Q3    J                 38           35
2019_Q3    K                  0            0
2019_Q3    L                 53           53
2019_Q3    M                 16           16
2019_Q3    N                  2            2

I would like to add to to the ratio column the ratio of Deadline met to Deadline missed. In other words

df['Ratio'] = df['Deadline missed'] / df['Deadline met']

However I have a number of zero values in he Deadline missed column

Which throw a ZeroDivisionError: division by zero error

to fix this I have tried using:

try:
    df['Ratio'] = df['Deadline missed'].div(df['Deadline met']) * 100
except ZeroDivisionError:
    df['Ratio'] = 0

without success.

What is the correct way to do this so my output looks like:

Quarter Body    Deadline missed Deadline met    Ratio
2019_Q3    A                  2            2      100
2019_Q3    B                 10            9       90
2019_Q3    C                 39           39      100
2019_Q3    D                  5            5      100
2019_Q3    E                  0           16        0
2019_Q3    F                  4            4      100
2019_Q3    G                 12           12      100
2019_Q3    H                  1            0        0
2019_Q3    I                 13           12       92
2019_Q3    J                 38           35       92
2019_Q3    K                  0            0        0
2019_Q3    L                 53           53      100
2019_Q3    M                 16           16      100
2019_Q3    N                  2            2      100
halfer
  • 19,824
  • 17
  • 99
  • 186
Stacey
  • 4,825
  • 17
  • 58
  • 99

2 Answers2

1

I don't get any error with your code but you could use Series.loc with Series.fillna:

df['Ratio']=( df['Deadline met'].div(df.loc[df['Deadline missed'].ne(0),'Deadline missed'])
                                   .fillna(0)
                                   .mul(100) )

or Series.whereSeries.where

df['Ratio']= (df['Deadline met'].div(df['Deadline missed'].where(df['Deadline missed'].ne(0)))
                                .fillna(0)
                                .mul(100) )

I also recommend you see: When should I want to use apply?


Output

    Quarter Body  Deadline missed  Deadline met       Ratio
0   2019_Q3    A                2             2  100.000000
1   2019_Q3    B               10             9   90.000000
2   2019_Q3    C               39            39  100.000000
3   2019_Q3    D                5             5  100.000000
4   2019_Q3    E                0            16    0.000000
5   2019_Q3    F                4             4  100.000000
6   2019_Q3    G               12            12  100.000000
7   2019_Q3    H                1             0    0.000000
8   2019_Q3    I               13            12   92.307692
9   2019_Q3    J               38            35   92.105263
10  2019_Q3    K                0             0    0.000000
11  2019_Q3    L               53            53  100.000000
12  2019_Q3    M               16            16  100.000000
13  2019_Q3    N                2             2  100.000000
ansev
  • 30,322
  • 5
  • 17
  • 31
0

You could try to use the apply method:


df['Ratio'] = df.apply(lambda row: 
    0 if row['Deadline met'] == 0 
    else row['Deadline missed'] / row['Deadline met'] * 100, 
    axis=1)
Julien Roullé
  • 662
  • 4
  • 15