假设我有一个像这样的数据框(df),有大量的行和列......
v w x y ... z
0 a p 1 1 ... 1
1 a q 0 1 ... 0
2 b p 1 1 ... 1
3 b q 0 1 ... 0
4 c p 1 1 ... 1
5 c q 1 0 ... 1
我想将 v 相同且 w 等于 p 的每一行中的值除以 v 列相同的行中跨列中每个值的总和,并在新行或新列中返回这个新值。 例如:
v w x y ... z
0 a p 1 1 ... 1
1 a q 0 1 ... 0
2 a r 1 0.5 ... 0.5
3 b p 1 1 ... 1
4 b q 0 1 ... 0
5 b r 0.5 1 ... 0.5
6 c p 1 1 ... 1
7 c q 1 0 ... 1
8 c r 1 0.5 ... 1
其中 w 列中包含 r 的行具有这些比例。
或者,这些比例可以位于新列中。我认为有些值是 NaN 或缺失,这很好。
v w x y ... z rx ry ... rz
0 a p 1 1 ... 1 1 0.5 ... 0.5
1 a q 0 1 ... 0 Nan Nan ... Nan
2 b p 1 1 ... 1 0.5 1 ... 0.5
3 b q 0 1 ... 0 Nan Nan ... Nan
4 c p 1 1 ... 1 1 0.5 ... 1
5 c q 1 0 ... 1 Nan Nan ... Nan
我可以使用一个简单的语句来对单列中的一组配对行执行此操作。
df.loc[df['v'] == 'a','rx'] = df.loc[df['v'] == 'a', 'x'].sum()
但我想对一个大型数据框执行此操作,在该数据框中制作单独的语句将花费大量时间。我知道我可以用循环来做到这一点,但我想知道是否有更简单的方法?我只是觉得这可以使用 numpy 或 pandas 函数/语句轻松完成。
谢谢!
最佳答案
IIUC 我将 set_index
与列 v ,然后只切片您需要的 numerator ,denumerator 是 sum
v 中所有相同值
df.set_index('v',inplace=True)
df=pd.concat([df,(df.loc[df.w=='p']/df.sum(level=0)).fillna('r')]).sort_index().reset_index()
df
Out[539]:
v w x y z
0 a p 1.0 1.0 1.0
1 a q 0.0 1.0 0.0
2 a r 1.0 0.5 1.0
3 b p 1.0 1.0 1.0
4 b q 0.0 1.0 0.0
5 b r 1.0 0.5 1.0
6 c p 1.0 1.0 1.0
7 c q 1.0 0.0 1.0
8 c r 0.5 1.0 0.5
关于python - Pandas - 使用算术将新行添加到数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55031922/