根据另一列的值计算列的唯一值
问题描述:
因此,我认为这是相对容易的问题。根据另一列的值计算列的唯一值
我有三列的数据帧:
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
Bloo dy很好的答案 – Chuck