应用基于条件的大熊猫GROUPBY列变化

扭曲:

道歉,如果我忽视的是,在别处解决类似的问题。这些都是我看着问这个问题之前的帖子:

根据病情熊猫数据帧GROUPBY

大熊猫GROUPBY顶替根据病情

蟒通过基于条件数据帧大熊猫组

问题:

给定一个数据帧

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'a': [1,2,2,3,3,4,5,5,6,6],
    'b': np.random.rand(10),
    'c': 10*[0],
})

有一列a保存的身份,并且列b有随机值,我要标注栏中将值c

如果是只有一个入口a,没有变化应适用。

如果有两个条目a我想重新标记的条目c在它b是最小的:

    a   b           c
0   1   0.472015    0  # <-- only one entry for a => nothing changes
1   2   0.553018    2  # <-- b is minimal => c gets value 2
2   2   0.770302    0
3   3   0.992023    0
4   3   0.119448    2  # <-- b is minimal => c gets value 2

做法:

结合groupbyagg.loc

g = df.groupby('a').agg({'b': [np.argmin, np.argmax]})
df.loc[g[g[('b', 'argmin')] != g[('b', 'argmax')]][('b', 'argmin')], 'c' ] = 2

此作品,但似乎很迂回。

有一个不太笨拙的方式去吗?

谢谢

帮助感激!

编辑:

组有一个或两个成员。如果两者都具有相同的b价值,没有什么应该发生。

df = pd.DataFrame({
    'a': [1,2,2,3,3,4,5,5,6,6],
    'b': [1,1,2,1,2,1,1,1,2,1],
    'c': 10*[0],
})

df.loc[df['b'].eq(df.groupby('a')['b'].transform('min')),'c']=2

out:

    a   b   c
0   1   1   2
1   2   1   2
2   2   2   0
3   3   1   2
4   3   2   0
5   4   1   2
6   5   1   2
7   5   1   2
8   6   2   0
9   6   1   2

df.loc[df.index==df.groupby('a')['b'].transform('idxmin'),'c']=2

    a   b   c
0   1   1   2  # <-- a has only one member, so this shouldn't be changed
1   2   1   2
2   2   2   0
3   3   1   2
4   3   2   0
5   4   1   2
6   5   1   2
7   5   1   0
8   6   2   0
9   6   1   2
anky_91:

你可以用groupby+transformdf.loc[]

df.loc[df['b'].eq(df.groupby('a')['b'].transform('min')),'c']=2

例:

df.loc[df['b'].eq(df.groupby('a')['b'].transform('min')),'c']=2
print(df)
   a         b  c
0  1  0.126956  2
1  2  0.249078  2
2  2  0.929619  0
3  3  0.013735  2
4  3  0.192781  0
5  4  0.268828  2
6  5  0.649238  2
7  5  0.767545  0
8  6  0.678478  2
9  6  0.815916  0

编辑:

g = df.groupby('a')
cond = pd.Series(df.index==g['b'].transform('idxmin')) & g['a'].transform('count').gt(1)
df.loc[cond,'c'] = 2

print(df)

   a  b  c
0  1  1  0
1  2  1  2
2  2  2  0
3  3  1  2
4  3  2  0
5  4  1  0
6  5  1  2
7  5  1  0
8  6  2  0
9  6  1  2

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章