2017-05-06 6 views
1

したがって、比較的簡単だと思った問題があります。別の列の値を指定して、列の一意の値を集計します。

私は3つの列を持つデータフレーム持っている:私はCであり、Bがありますどのように多くのユニークな値(X1、X2、X3)のグループごとに、今したい場合は、今すぐ

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 

を2よりも大きい、と私はforループを使用せずに、Pythonのパンダでこれを取得する必要がありますどのように私は、次の

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 

を返す新しい列Dにこれを割り当てますか?これは可能ですか?

答えて

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

関連する問題