pandas - groupby 在 pandas 中使用 if 条件进行转换

标签 pandas

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

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

我想执行 groupby 并转换 new 列是每个值除以 group mean ,我可以按如下方式执行

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

换句话说,如果 val 是带有 groupby 和 transform 的 np.nan,我该如何检查。

提前致谢

最佳答案

添加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

关于pandas - groupby 在 pandas 中使用 if 条件进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73287707/

相关文章:

python - 使用 pandas read_csv 时将分隔符限制为仅某些选项卡

python - 保留满足两个条件的组

python - 使用 exec 修改具有动态逻辑的 Pandas 数据框

python - 使用 pandas dataframe 滑动窗口数据

python - 当值大于某值时如何返回第一个索引

python - 如何根据 Pandas 中第一个数据帧中的某些列值添加第二个数据帧中的列值

python - 如何延长图中的回归线?

python - 我可以合并 groupby 数据吗?

python - Pandas 将逗号分隔的字符串列拆分为两个单独的列,并向下分解行

python - 合并具有特定条件的数据帧