python(pandas)根据来自不同行的值创建一个新列

我有一个来自 cvs 文件的数据框,如下所示:


     #F      E    G

0     1  n.e.   153

1     1     60   15

2     1     99   10

3     1      S   23

4     2  n.e.   190

5     2     60   44

6     2     99   22

7     2      S   67

我想为此添加一个新列。


对于每个 [#F] 组,每行中的 [G] 值应除以 [E]='ne' 行中的 [G]-值 所以,最后,它应该如下所示:


     #F      E    G     rel

0     1  n.e.   153   1.000

1     1     60   15   0.098

2     1     99   10   0.065

3     1      S   23   0.150

4     2  n.e.   190   1.000

5     2     60   44   0.232

6     2     99   22   0.116

7     2      S   67   0.353

我已经尝试了几种使用函数、组或 np.where 的方法,但问题比我所经历的要复杂一些,最终没有任何解决办法。


谢谢你的帮助。


30秒到达战场
浏览 88回答 3
3回答

海绵宝宝撒

我会用Series.div. 使用和n.e.为每个组创建一个具有相应值的系列。Series.whereGroupby.transform请注意first,省略NaN值,因此.ne.值在组中的位置无关紧要。我们也可以max使用first.df['Rel']=df['G'].div(df['G'].where(df['E'].eq('n.e.'))                             .groupby(df['#F']).transform('first'))print(df)  #F     E    G       Rel0  1  n.e.  153  1.0000001  1    60   15  0.0980392  1    99   10  0.0653593  1     S   23  0.1503274  2  n.e.  190  1.0000005  2    60   44  0.2315796  2    99   22  0.1157897  2     S   67  0.352632编辑df['Rel']=df['G'].div(df['G'].where(df['E'].eq('n.e. '))                             .groupby(df['#F']).transform('first'))

MM们

IIUCtransformdf['Rel']=df.G/df.groupby(['name','#F']).G.transform('max')df   name  #F     E    G       Rel0  T.w.   1  n.e.  153  1.0000001  T.w.   1    60   15  0.0980392  T.w.   1    99   10  0.0653593  T.w.   1     S   23  0.1503274  T.w.   2  n.e.  190  1.0000005  T.w.   2    60   44  0.2315796  T.w.   2    99   22  0.1157897  T.w.   2     S   67  0.352632方法二s=df.loc[df.E.eq('n.e.')].set_index(['name', '#F']).G.reindex(pd.MultiIndex.from_frame(df[['name', '#F']])).valuesdf['Rel']=df.G/s或者df['Rel']=df.G/df.G.mul(df.E.eq('n.e.')).groupby([df['name'],df['#F']]).transform('max')df   name  #F     E    G       Rel0  T.w.   1  n.e.  153  1.0000001  T.w.   1    60   15  0.0980392  T.w.   1    99   10  0.0653593  T.w.   1     S   23  0.1503274  T.w.   2  n.e.  190  1.0000005  T.w.   2    60   44  0.2315796  T.w.   2    99   22  0.1157897  T.w.   2     S   67  0.352632

慕婉清6462132

df.loc[df['E'] == 'n.e.', 'G_ne'] = df['G']df['G_ne'] = df['G_ne'].fillna(method='ffill')df['rel'] = df['G'] / df['G_ne']print(df)输出:   #F     E    G   G_ne       rel0   1  n.e.  153  153.0  1.0000001   1    60   15  153.0  0.0980392   1    99   10  153.0  0.0653593   1     S   23  153.0  0.1503274   2  n.e.  190  190.0  1.0000005   2    60   44  190.0  0.2315796   2    99   22  190.0  0.1157897   2     S   67  190.0  0.352632
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python