pandas 在 Dataframe 内使用带条件的转换

zvokhttg  于 2022-12-17  发布在  其他
关注(0)|答案(3)|浏览(108)

具有以下df

import numpy as np
import random

i = ['dog', 'cat', 'rabbit', 'elephant'] * 20

df = pd.DataFrame(np.random.randn(len(i), 3), index=i, \
            columns=list('ABC')).rename_axis('animal').reset_index()
            
df.insert(1, 'type', pd.Series(random.choice(['X', 'Y']) \
                for _ in range(len(df))))

如果动物的类型是X,我希望A列的max ......否则A列的min在单独的列中。
将lambda与group by一起应用显示了具有以下代码的多索引数组:

g = df.groupby(['animal', 'type'])
g.apply(lambda g: np.where (g.type == 'X', g.A.max(), g.A.min()))

有没有办法把它转换成一个序列,可以作为一列添加到df中......比如说使用transform

t2a7ltrp

t2a7ltrp1#

这就是你想要的吗?

>>> df

     animal type     A     B     C
0       cat    Y  0.96 -0.02 -0.14
1       cat    Y -0.80  0.86  1.75
2       dog    X  1.13 -0.49 -1.66
3       dog    Y  0.84 -0.07  0.15
4  elephant    X  0.13 -0.54  0.73
5  elephant    Y  0.14  1.77  0.94
6    rabbit    X -0.12 -0.39  0.05
7    rabbit    X  0.58 -1.17  0.77

>>> def max_min_A(g):
        animal, type_ = g.name 
        return np.where(type_ == 'X', g.max(), g.min())

>>> df['new_col'] = df.groupby(['animal', 'type'])['A'].transform(max_min_A)

     animal type     A     B     C  new_col
0       cat    Y  0.96 -0.02 -0.14    -0.80
1       cat    Y -0.80  0.86  1.75    -0.80
2       dog    X  1.13 -0.49 -1.66     1.13
3       dog    Y  0.84 -0.07  0.15     0.84
4  elephant    X  0.13 -0.54  0.73     0.13
5  elephant    Y  0.14  1.77  0.94     0.14
6    rabbit    X -0.12 -0.39  0.05     0.58
7    rabbit    X  0.58 -1.17  0.77     0.58
6kkfgxo0

6kkfgxo02#

@哈利绘图仪:Thx的name信息。这是美妙的看到,名称的组传播作为一个元组。如果有人不想使用一个函数,以下将工作:

df.assign(new_col=g.A.transform(lambda x: np.where(x.name[1] =='X', \
            x.max(), x.min()))) 
# x.name[1] is used to select the second element of the tuple, which is `type`
vhmi4jdf

vhmi4jdf3#

我认为从性能方面考虑,最好构建临时列,而不是通过groupby进行迭代:

grp = df.groupby(['animal', 'type'])['A']

(df
.assign(
    mi = grp.transform('min'), 
    ma = grp.transform('max'), 
    new_col = lambda df: np.where(df['type'] == 'X', df['ma'], df['mi']))
.drop(columns=['mi','ma']
)
     animal type     A     B     C  new_col
0       cat    Y  0.96 -0.02 -0.14    -0.80
1       cat    Y -0.80  0.86  1.75    -0.80
2       dog    X  1.13 -0.49 -1.66     1.13
3       dog    Y  0.84 -0.07  0.15     0.84
4  elephant    X  0.13 -0.54  0.73     0.13
5  elephant    Y  0.14  1.77  0.94     0.14
6    rabbit    X -0.12 -0.39  0.05     0.58
7    rabbit    X  0.58 -1.17  0.77     0.58

相关问题