Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 大熊猫组内的交替值_Python_Pandas - Fatal编程技术网

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