在pandas数据框列中表示比率

时间:2018-12-30 16:45:40

标签: python pandas

我正在尝试在dataframe列中表示比率。但是,当我只能够使用打印功能并打印所需的内容时,我得到的格式太可怕了。真正的问题是以正确的格式表示它。

我要做的是创建最大公约数,现在我想将其应用于我的数据框

def gcd(a,b):
    """ Greatest common divisor """
    while b!=0:
        r=a%b
        a,b=b,r
    return a

 #trying the function
 a= int(15/gcd(15,10))
 b= int(10/gcd(15,10))
 print( a,':',b)  
 # result
 3 : 2

 # Dataframe
 d = {'col1': [3, 2], 'col2': [12, 4]}
 df = pd.DataFrame(data=d)
 df 

 col1 col2
0  3   12  
1  2    4  

#applying the function to the frame
df['gcd'] = df.apply(lambda x: gcd(x['col2'], x['col1']), axis=1)
 col1 col2 gcd
0  3   12   3
1  2    4   2


df['ratio']= str(df['col1']/df['gcd']) + ':' + str(df['col2']/df['gcd'])
# this result gives me a very bad formatting 

我想要的是一个如下所示的比率列:

ratio
 3:2
 4:5

对我来说,主要问题是用冒号表示某些内容。

1 个答案:

答案 0 :(得分:0)

目前尚不清楚如何推导3:24:5。但请注意,您可以使用NumPy(通过np.gcd)来计算最大公约数,因为这些操作将被矢量化。或者,您可以将fractions模块与列表理解一起使用,以转换为字符串。

假设我们从此数据帧开始。

# input dataframe
df = pd.DataFrame({'col1': [3, 2], 'col2': [12, 4]})

np.gcd:矢量化计算

此解决方案是部分矢量化的。计算本身按列进行。通过串联或f字符串和列表理解来构造字符串,使用的是Python级循环。

factored = df.div(np.gcd(df['col1'], df['col2']), axis=0).astype(int)
df['ratio'] = factored['col1'].astype(str) + ':' + factored['col2'].astype(str)
# alternative list comprehension
# zipper = zip(factored['col1'], factored['col2'])
# df['ratio'] = [f'{x}:{y}' for x, y in zipper]

Fraction + str.replace +列表理解

单独使用按行操作,您可以使用单个列表理解:

from fractions import Fraction
zipper = zip(df['col1'], df['col2'])
df['ratio'] = [str(Fraction(x, y)).replace('/', ':') for x, y in zipper]

两种情况下的结果均相同:

   col1  col2 ratio
0     3    12   1:4
1     2     4   1:2