将函数应用于数据帧熊猫

时间:2018-04-26 07:09:30

标签: python-3.x pandas dataframe apply

我想将我的函数应用于数据帧,但它不应该影响第一行。这是我的总和。当我将函数应用于数据帧时,它也将第一行分开。我试图将每个值除以第一行值。

我怎么能成功呢? 我还要显示两位小数的结果,例如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

谢谢,

1 个答案:

答案 0 :(得分:1)

我建议不要使用apply,因为使用diviloc的矢量化解决方案很慢,更好:

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'>