根据另一列的值计算列的唯一值

问题描述:

因此,我认为这是相对容易的问题。根据另一列的值计算列的唯一值

我有三列的数据帧:

A B C 
x1 a 2 
x1 a 2 
x1 b 3 
x1 c 4 
x1 c 4 
x2 d 2 
x2 d 2 
x3 e 5 
x3 e 5 

现在,如果我想现在每个组A(X1,X2,X3)的多少唯一值有在B中的C是大于2,并指定这个新的一列d这将返回我下面

A B C D 
x1 a 2 2 
x1 a 2 2 
x1 b 3 2 
x1 c 4 2 
x1 c 4 2 
x2 d 2 0 
x2 d 2 0 
x3 e 5 1 
x3 e 5 1 

我应该如何得到这个在Python大熊猫,而无需使用一个循环?这可能吗?

map + groupby + apply + nunique

df['D'] = df['A'].map(df.groupby('A').apply(lambda x: x.loc[x.C > 2, 'B'].nunique())) 
print (df) 
    A B C D 
0 x1 a 2 2 
1 x1 a 2 2 
2 x1 b 3 2 
3 x1 c 4 2 
4 x1 c 4 2 
5 x2 d 2 0 
6 x2 d 2 0 
7 x3 e 5 1 
8 x3 e 5 1 

map + query + groupby + nunique + fillna + astype

df['D'] = df['A'].map(df.query('C > 2').groupby('A')['B'].nunique()).fillna(0).astype(int) 
print (df) 
    A B C D 
0 x1 a 2 2 
1 x1 a 2 2 
2 x1 b 3 2 
3 x1 c 4 2 
4 x1 c 4 2 
5 x2 d 2 0 
6 x2 d 2 0 
7 x3 e 5 1 
8 x3 e 5 1 

您可以先根据列C进行过滤,然后使用groupby.nunique。将得到的系列可以用作作图:

df['D'] = df['A'].map(df[df['C']>2].groupby('A')['B'].nunique()).fillna(0) 

df 
Out: 
    A B C D 
0 x1 a 2 2.0 
1 x1 a 2 2.0 
2 x1 b 3 2.0 
3 x1 c 4 2.0 
4 x1 c 4 2.0 
5 x2 d 2 0.0 
6 x2 d 2 0.0 
7 x3 e 5 1.0 
8 x3 e 5 1.0 
+2

Bloo dy很好的答案 – Chuck