2017-05-06 205 views
1

因此,我認爲這是相對容易的問題。根據另一列的值計算列的唯一值

我有三列的數據幀:

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大熊貓,而無需使用一個循環?這可能嗎?

回答

2

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 
4

您可以先根據列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

相關問題