如何在熊猫数据框中的每个组上标记第一个值

时间:2019-07-15 08:26:37

标签: python pandas dataframe

我后面有一个数据框

      A      B  
0     0      0   
1     0      0 
2     0      0 
3     1      0 
4     0      0 
5     0      0
6     0      0
7     0      1  
8     1      1  
9     1      1  
10    0      1 
11    0      1 
12    0      1  
13    1      1
14    0      2  
15    0      2    
16    0      2 
17    1      2  
18    0      2 
19    1      2
20    1      2 

并且我想使“ C”成为每个组“ B”的A的第一个值的标记

      A      B      C
0     0      0      0
1     0      0      0
2     0      0      0
3     1      0      1
4     0      0      0
5     0      0      0
6     0      0      0
7     0      1      0
8     1      1      1
9     1      1      0
10    0      1      0
11    0      1      0
12    0      1      0
13    1      1      0
14    0      2      0
15    0      2      0
16    0      2      0
17    1      2      1
18    0      2      0
19    1      2      0
20    1      2      0

我不知道要这样做 我尝试了groupby方法,但未能将它们放在新列中

2 个答案:

答案 0 :(得分:0)

尝试使用groupbytransformnp.where

df['C'] = df.groupby('B')['A'].transform(lambda x: np.where(x.duplicated(), 0, x))

现在:

print(df)

是:

    A  B  C
0   0  0  0
1   0  0  0
2   0  0  0
3   1  0  1
4   0  0  0
5   0  0  0
6   0  0  0
7   0  1  0
8   1  1  1
9   1  1  0
10  0  1  0
11  0  1  0
12  0  1  0
13  1  1  0
14  0  2  0
15  0  2  0
16  0  2  0
17  1  2  1
18  0  2  0
19  1  2  0
20  1  2  0

答案 1 :(得分:0)

这里groupby不是必需的,因为可以使用DataFrame.duplicated测试每列的重复值,并通过numpy.where创建新列:

df['C'] = np.where(df.duplicated(['A','B']), 0, df['A'])
print (df)
    A  B  C
0   0  0  0
1   0  0  0
2   0  0  0
3   1  0  1
4   0  0  0
5   0  0  0
6   0  0  0
7   0  1  0
8   1  1  1
9   1  1  0
10  0  1  0
11  0  1  0
12  0  1  0
13  1  1  0
14  0  2  0
15  0  2  0
16  0  2  0
17  1  2  1
18  0  2  0
19  1  2  0
20  1  2  0