anarchy
anarchy

Reputation: 5194

How to flip a column of ratios, convert into a fraction and convert to a float

I have the following data frame:

         Date Ratio
0  2000-06-21   4:1
1  2000-06-22   3:2
2  2000-06-23   5:7
3  2000-06-24   7:1

For each item in the Ratio column, I want to reverse the ratio, convert it into a fraction and convert it to a float.

Meaning 4:1 would become 1:4, then the : would be replaced with a / and finally it would get 0.25. 3:2 would become 2/3 which is converted to 0.66666666666.

So far I only have the following code:

df['Ratio'] = df['Ratio'].str.split(":")

Upvotes: 1

Views: 267

Answers (3)

jezrael
jezrael

Reputation: 863226

Create new DataFrame with expand=True in Series.str.split, convert to integers and last divide columns:

df1 = df['Ratio'].str.split(":", expand=True).astype(int)
df['Ratio'] = df1[1].div(df1[0])

For one line solution is possible use DataFrame.set_axis and DataFrame.eval:

df['Ratio'] = (df['Ratio'].str.split(":",expand=True)
                          .astype(int)
                          .set_axis(['a','b'], inplace=False, axis=1)
                          .eval('b/a'))
print (df)
         Date     Ratio
0  2000-06-21  0.250000
1  2000-06-22  0.666667
2  2000-06-23  1.400000
3  2000-06-24  0.142857

Upvotes: 4

Jaroslav Bezděk
Jaroslav Bezděk

Reputation: 7635

You can also use your own function, for example this one:

def get_new_ratio(ratio):
    ratio_splitted = list(map(int, ratio.split(':')))
    return ratio_splitted[1] / ratio_splitted[0]

And after that use it as an argument in pandas.DataFrame.apply():

>>> df['new_ratio'] = df.Ratio.apply(get_new_ratio)
>>> print(df)
         Date Ratio  new_ratio
0  2000-06-21   4:1   0.250000
1  2000-06-22   3:2   0.666667
2  2000-06-23   5:7   1.400000
3  2000-06-24   7:1   0.142857

Upvotes: 1

esse
esse

Reputation: 1551

How about:

df['Ratio'] = df['Ratio'].apply(lambda x: 1 / eval(x.replace(':', '/')))

Or:

df['Ratio'] = 1 / df['Ratio'].str.replace(':', '/').apply(eval)

Or as commented by @anky_91, pd.eval also works:

df['Ratio'] = 1 / pd.eval(df['Ratio'].str.replace(':', '/'))

Upvotes: 3

Related Questions