pandas 创建新列并填充来自同一 Dataframe 的计算值

rsl1atfo  于 2023-02-17  发布在  其他
关注(0)|答案(3)|浏览(185)

下面是我的df的一个简化示例:

ds = pd.DataFrame(np.abs(randn(3, 4)), index=[1,2,3], columns=['A','B','C','D'])
ds['sum'] = ds.sum(axis=1)

看起来像是

A         B         C         D       sum
1  0.095389  0.556978  1.646888  1.959295  4.258550
2  1.076190  2.668270  0.825116  1.477040  6.046616
3  0.245034  1.066285  0.967124  0.791606  3.070049

我想创建4个新列,并计算每一行中总计的百分比值。因此,第一个新列中的第一个值应为(0.095389/4.258550),第二个新列中的第一个值应为(0.556978/4.258550)......依此类推。

aiazj4mn

aiazj4mn1#

您可以轻松地为每个列手动执行此操作,如下所示:

df['A_perc'] = df['A']/df['sum']

如果要在一个步骤中对所有列执行此操作,可以使用div方法(http://pandas.pydata.org/pandas-docs/stable/basics.html#matching-broadcasting-behavior):

ds.div(ds['sum'], axis=0)

如果您希望在一个步骤中将其添加到同一 Dataframe :

>>> ds.join(ds.div(ds['sum'], axis=0), rsuffix='_perc')
          A         B         C         D       sum    A_perc    B_perc  \
1  0.151722  0.935917  1.033526  0.941962  3.063127  0.049532  0.305543   
2  0.033761  1.087302  1.110695  1.401260  3.633017  0.009293  0.299283   
3  0.761368  0.484268  0.026837  1.276130  2.548603  0.298739  0.190013   

     C_perc    D_perc  sum_perc  
1  0.337409  0.307517         1  
2  0.305722  0.385701         1  
3  0.010530  0.500718         1
6l7fqoea

6l7fqoea2#

In [56]: df = pd.DataFrame(np.abs(randn(3, 4)), index=[1,2,3], columns=['A','B','C','D'])

In [57]: df.divide(df.sum(axis=1), axis=0)
Out[57]: 
          A         B         C         D
1  0.319124  0.296653  0.138206  0.246017
2  0.376994  0.326481  0.230464  0.066062
3  0.036134  0.192954  0.430341  0.340571
50few1ms

50few1ms3#

您可以将sum列转换为numpy列数组和广播分区。

new_df = df / df[['sum']].values     # note the double-brackets around 'sum'

要将百分比添加为新列,

df[df.columns.drop('sum') + '_perc'] = df.drop(columns='sum') / df[['sum']].values

相关问题