为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

30秒到达战场 2022-07-19 10:27:47
我有一个来自 cvs 文件的数据框,如下所示:     #F      E    G0     1  n.e.   1531     1     60   152     1     99   103     1      S   234     2  n.e.   1905     2     60   446     2     99   227     2      S   67我想为此添加一个新列。对于每个 [#F] 组,每行中的 [G] 值应除以 [E]='ne' 行中的 [G]-值 所以,最后,它应该如下所示:     #F      E    G     rel0     1  n.e.   153   1.0001     1     60   15   0.0982     1     99   10   0.0653     1      S   23   0.1504     2  n.e.   190   1.0005     2     60   44   0.2326     2     99   22   0.1167     2      S   67   0.353我已经尝试了几种使用函数、组或 np.where 的方法,但问题比我所经历的要复杂一些,最终没有任何解决办法。谢谢你的帮助。
查看完整描述

3 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

我会用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       Rel

0  1  n.e.  153  1.000000

1  1    60   15  0.098039

2  1    99   10  0.065359

3  1     S   23  0.150327

4  2  n.e.  190  1.000000

5  2    60   44  0.231579

6  2    99   22  0.115789

7  2     S   67  0.352632

编辑


df['Rel']=df['G'].div(df['G'].where(df['E'].eq('n.e. '))

                             .groupby(df['#F']).transform('first'))


查看完整回答
反对 回复 2022-07-19
?
MM们

TA贡献1886条经验 获得超2个赞

IIUCtransform


df['Rel']=df.G/df.groupby(['name','#F']).G.transform('max')

df

   name  #F     E    G       Rel

0  T.w.   1  n.e.  153  1.000000

1  T.w.   1    60   15  0.098039

2  T.w.   1    99   10  0.065359

3  T.w.   1     S   23  0.150327

4  T.w.   2  n.e.  190  1.000000

5  T.w.   2    60   44  0.231579

6  T.w.   2    99   22  0.115789

7  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']])).values

df['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       Rel

0  T.w.   1  n.e.  153  1.000000

1  T.w.   1    60   15  0.098039

2  T.w.   1    99   10  0.065359

3  T.w.   1     S   23  0.150327

4  T.w.   2  n.e.  190  1.000000

5  T.w.   2    60   44  0.231579

6  T.w.   2    99   22  0.115789

7  T.w.   2     S   67  0.352632


查看完整回答
反对 回复 2022-07-19
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

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       rel

0   1  n.e.  153  153.0  1.000000

1   1    60   15  153.0  0.098039

2   1    99   10  153.0  0.065359

3   1     S   23  153.0  0.150327

4   2  n.e.  190  190.0  1.000000

5   2    60   44  190.0  0.231579

6   2    99   22  190.0  0.115789

7   2     S   67  190.0  0.352632


查看完整回答
反对 回复 2022-07-19
  • 3 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信