这是数据框:
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
我的目标是将binA
到binH
除以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 .. .. .. .. .. .. .. ..
....表示计算得出的一些数字。
我需要在代码中为所需的输出进行什么编辑?
答案 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