Python 大熊猫组内的交替值
我有以下数据帧:Python 大熊猫组内的交替值,python,pandas,Python,Pandas,我有以下数据帧: df1 a b 4 0 1 5 0 1 6 0 2 2 0 3 3 1 2 15 1 3 12 1 3 13 1 1 15 3 1 14 3 1 8 3 1 9 3 1 10 3 2 我
df1
a b
4 0 1
5 0 1
6 0 2
2 0 3
3 1 2
15 1 3
12 1 3
13 1 1
15 3 1
14 3 1
8 3 1
9 3 1
10 3 2
我需要另一列,按a,b分组,并在a的每组内交替赋值1,2,始终从1开始。
应该是这样的:
a b c
4 0 1 1
5 0 1 1
6 0 2 2
2 0 3 1
3 1 2 1
15 1 3 2
12 1 3 2
13 1 1 1
15 3 1 1
14 3 1 1
8 3 1 1
9 3 1 1
10 3 2 2
一种方法是,采用基本上枚举每组的方法,然后采用2
模,并使用结果从1
或2
进行索引:
import numpy
df['c'] = np.array([1,2])[df.groupby(['a','b']).ngroup().values%2]
更新,使
a
中的每个现在组以1
开头(改编@wen的答案):
使用
transform
+factorize
df.groupby('a').b.transform(lambda x : (x.factorize()[0]+1)//2+1)
4 1
5 1
6 2
2 1
3 2
15 2
12 2
13 2
15 1
14 1
8 1
9 1
Name: b, dtype: int64
非常感谢。这几乎就是我想要的。在每个“a”组中,应始终以1开头。如果查看最后4行,它以2开头。我该如何解决这个问题?好的,我明白了,我会尝试改编@mirekgt这是我脑海中的想法。现在可以工作了@MirekG?这很好,但是在一个巨大的数据帧中工作得很慢。非常感谢你!
df['c'] = df.groupby('a').b.transform(lambda x : x.factorize()[0]%2+1)
print(df)
a b c
4 0 1 1
5 0 1 1
6 0 2 2
2 0 3 1
3 1 2 1
15 1 3 2
12 1 3 2
13 1 1 1
15 3 1 1
14 3 1 1
8 3 1 1
9 3 1 1
10 3 2 2
df.groupby('a').b.transform(lambda x : (x.factorize()[0]+1)//2+1)
4 1
5 1
6 2
2 1
3 2
15 2
12 2
13 2
15 1
14 1
8 1
9 1
Name: b, dtype: int64