在熊猫中划分选定的列

时间:2018-10-27 20:30:38

标签: pandas

这是数据框:

bins  year  binA  binB  binC  binD  binE  binF  binG  binH
0     1998   4.0   5.0   1.0   1.0   2.0   0.0   1.0   0.0
1     1999   4.0   2.0   1.0   0.0   0.0   4.0   1.0   2.0
2     2000   4.0   1.0   1.0   0.0   4.0   1.0   1.0   2.0
3     2001   2.0   1.0   4.0   1.0   1.0   0.0   2.0   3.0

我的目标是将binAbinH除以binA:binH的总和,或者对于1998年的行,除以不包括年数的行总和。

所需列的总和: newdfdd.loc[:,'binA':'binH'].sum(axis=1)

要获得所需的值,这就是我尝试过的:

newdfdd[['binA','binB','binC','binD','binE',
         'binF','binG' ,'binH']].div(newdfdd.loc[:,'binA':'binH'].sum(axis=1))

但是,我得到了NaN和另外四列,如下所示:

0   1   2   3   binA   binB binC binD binE binF binG binH
0   NaN NaN NaN NaN    NaN  NaN NaN NaN NaN NaN NaN NaN
1   NaN NaN NaN NaN    NaN  NaN NaN NaN NaN NaN NaN NaN
2   NaN NaN NaN NaN    NaN  NaN NaN NaN NaN NaN NaN NaN
3   NaN NaN NaN NaN    NaN  NaN NaN NaN NaN NaN NaN NaN

我想要以下格式的结果:

bins  year   binA  binB  binC  binD  binE  binF  binG  binH
0     1998   0.285 0.357  ...   ....  ....  ....  ...  ...        
1     1999   ..   ..   ..   ..   ..   ..   ..   ..

....表示计算得出的一些数字。

我需要在代码中为所需的输出进行什么编辑?

2 个答案:

答案 0 :(得分:0)

我认为这是您要寻找的结果:

df['rowSum'] = df[df.columns[2:]].apply(sum, axis=1)
df[df.columns[2:]].apply(lambda x: (x / x['rowSum']), axis=1).drop(columns=['rowSum'])

        binA        binB        binC        binD        binE       binF     binG        binH
0   0.285714    0.357143    0.071429    0.071429    0.142857    0.000000    0.071429    0.000000
1   0.285714    0.142857    0.071429    0.000000    0.000000    0.285714    0.071429    0.142857
2   0.285714    0.071429    0.071429    0.000000    0.285714    0.071429    0.071429    0.142857
3   0.142857    0.071429    0.285714    0.071429    0.071429    0.000000    0.142857    0.214286

答案 1 :(得分:0)

div语句中,您需要提供axis='index',它应该会得到您想要的结果。

因此,您上面的代码应如下所示:

newdfdd.update(newdfdd.loc[:,'binA':'binH'].div(newdfdd.loc[:,'binA':'binH'].sum(axis=1), 
                                                axis='index'))

这将根据需要计算行总和的百分比,然后在newfdd数据框中更新这些值。

为清晰起见,这是我解决方案的全部内容(我使用df和随机变量,但其余部分相同):

df = pd.DataFrame({'bins':[0,1,2,3],
              'year':[1998,1999,2000,2001],
              'binA':np.random.randint(1,10,4),
              'binB':np.random.randint(1,10,4),
              'binC':np.random.randint(1,10,4),
              'binD':np.random.randint(1,10,4),
              'binE':np.random.randint(1,10,4),
              'binF':np.random.randint(1,10,4),
              'binG':np.random.randint(1,10,4),
              'binH':np.random.randint(1,10,4)})

#reodering columns to match your dataframe layout
df = df[['bins','year','binA','binB','binC','binD','binE',
     'binF','binG' ,'binH']]

df.update(df.loc[:,'binA':'binH'].div(df.loc[:,'binA':'binH'].sum(axis=1),axis='index'))

print(df)

   bins year    binA        binB        binC        binD        binE    binF    binG    binH
0   0   1998    0.222222    0.037037    0.148148    0.185185    0.037037    0.111111    0.037037    0.222222
1   1   1999    0.264706    0.058824    0.205882    0.058824    0.029412    0.147059    0.176471    0.058824
2   2   2000    0.166667    0.041667    0.145833    0.020833    0.166667    0.166667    0.145833    0.145833
3   3   2001    0.062500    0.187500    0.020833    0.145833    0.083333    0.166667    0.166667    0.166667