使用 Pandas 中的 if 条件对 Groupby 转换进行操作

3

我有一个如下所示的数据框

df = pd.DataFrame({'key': ['a', 'a', 'a', 'b', 'c', 'c'] , 'val' : [10, np.nan, 9 , 10, 11, 13]})
df

key val
0   a   10.0
1   a   NaN
2   a   9.0
3   b   10.0
4   c   11.0
5   c   13.0

我想进行分组并转换,使得new列的每个值都是该组均值除以该值,我可以按照以下方式完成:

df['new'] = df.groupby('key')['val'].transform(lambda g :  g/g.mean())
df.new

0    1.052632
1         NaN
2    0.947368
3    1.000000
4    0.916667
5    1.083333
Name: new, dtype: float64

现在我有一个条件,如果val是np.nan,则new列的值将为np.inf,应如下所示。
0    1.052632
1    np.inf
2    0.947368
3    1.000000
4    0.916667
5    1.083333
Name: new, dtype: float64

换句话说,如何使用groupby和transform检查一个val是否为np.nan。谢谢!
1个回答

1
添加Series.replace
df['new'] = (df.groupby('key')['val'].transform(lambda g :  g/g.mean())
               .replace(np.nan, np.inf))
print (df)
  key   val       new
0   a  10.0  1.052632
1   a   NaN       inf
2   a   9.0  0.947368
3   b  10.0  1.000000
4   c  11.0  0.916667
5   c  13.0  1.083333

或者 numpy.where
df['new'] = np.where(df.val.isna(), 
                     np.inf, df.groupby('key')['val'].transform(lambda g :  g/g.mean()))
print (df)
  key   val       new
0   a  10.0  1.052632
1   a   NaN       inf
2   a   9.0  0.947368
3   b  10.0  1.000000
4   c  11.0  0.916667
5   c  13.0  1.083333

1
谢谢..我更倾向于使用条件,所以更喜欢第二个答案。 - Bharat Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接