我想将我的函数应用于数据帧,但它不应该影响第一行。这是我的总和。当我将函数应用于数据帧时,它也将第一行分开。我试图将每个值除以第一行值。
我怎么能成功呢? 我还要显示两位小数的结果,例如40,00而不是* 40,0。
这是我的功能和数据框
df1 = pd.DataFrame(np.array([[200,200],[40,40],[80,80],[80,80]]), columns=
["Erkek","Kadin"], index=["Base","AB","C1","C2"])
def yuzde(x):
x = x/x[0]
x = x*100
return round(x,2)
tablo = df1.apply(yuzde, axis=0)
print(tablo)
我的输出是:
Erkek Kadin
Base 100.0 100.0
AB 20.0 20.0
C1 40.0 40.0
C2 40.0 40.0
但我想要它;
Erkek Kadin
Base 200 200
AB 20.00 20.00
C1 40.00 40.00
C2 40.00 40.00
谢谢,
答案 0 :(得分:1)
我建议不要使用apply
,因为使用div
和iloc
的矢量化解决方案很慢,更好:
df1.iloc[1:] = df1.iloc[1:].div(df1.iloc[0]).mul(100)
print (df1)
Erkek Kadin
Base 200.0 200.0
AB 20.0 20.0
C1 40.0 40.0
C2 40.0 40.0
如果需要更改格式,可以string
添加applymap
:
df1.iloc[1:] = df1.iloc[1:].div(df1.iloc[0]).mul(100).applymap('{:,.2f}'.format)
print (df1)
Erkek Kadin
Base 200 200
AB 20.00 20.00
C1 40.00 40.00
C2 40.00 40.00
print (df1.applymap(type))
Erkek Kadin
Base <class 'int'> <class 'int'>
AB <class 'str'> <class 'str'>
C1 <class 'str'> <class 'str'>
C2 <class 'str'> <class 'str'>
df1.iloc[1:] = df1.iloc[1:].div(df1.iloc[0]).mul(100).applymap('{:,.2f}'.format)
df1 = df1.astype(str)
print (df1)
Erkek Kadin
Base 200 200
AB 20.00 20.00
C1 40.00 40.00
C2 40.00 40.00
print (df1.applymap(type))
Erkek Kadin
Base <class 'str'> <class 'str'>
AB <class 'str'> <class 'str'>
C1 <class 'str'> <class 'str'>
C2 <class 'str'> <class 'str'>