我正在尝试在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
对我来说,主要问题是用冒号表示某些内容。
答案 0 :(得分:0)
目前尚不清楚如何推导3:2
和4: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