道歉,如果我忽视的是,在别处解决类似的问题。这些都是我看着问这个问题之前的帖子:
给定一个数据帧
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
结合groupby
,agg
和.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
你可以用groupby+transform
与df.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] 删除。
我来说两句