[英]Count the number of unique values per group
我有2列-_a,_b。
import numpy as np
import pandas as pd
df = pd.DataFrame({'_a':[1,1,1,2,2,3,3],'_b':[3,4,5,3,3,3,9], 'a_b_3':[3,3,3,1,1,2,2]})
df
_a _b a_b_3
0 1 3 3
1 1 4 3
2 1 5 3
3 2 3 1
4 2 3 1
5 3 3 2
6 3 9 2
我需要使用來自熊貓的groupby創建a_b_3列(來自'_b'列的唯一計數)。 先感謝您。
看起來像您要transform
+ nunique
;
df['a_b_3'] = df.groupby('_a')['_b'].transform('nunique')
df
_a _b a_b_3
0 1 3 3
1 1 4 3
2 1 5 3
3 2 3 1
4 2 3 1
5 3 3 2
6 3 9 2
這實際上是groupby
+ nunique
+ map
:
v = df.groupby('_a')['_b'].nunique()
df['a_b_3'] = df['_a'].map(v)
df
_a _b a_b_3
0 1 3 3
1 1 4 3
2 1 5 3
3 2 3 1
4 2 3 1
5 3 3 2
6 3 9 2
采用 -
df2=df.groupby(['_a'])['_b'].nunique().reset_index()
df['a_b_3'] = df.merge(df2, how='left', on='_a')[['_b_y']]
輸出量
_a _b a_b_3
0 1 3 3
1 1 4 3
2 1 5 3
3 2 3 1
4 2 3 1
5 3 3 2
6 3 9 2
如果我正確理解了您想要按_a列分組的內容,請計算每個組中_b列中唯一值的數量,然后使用_a作為鍵將此計數附加到原始數據幀中。 下面的代碼應該可以實現這一點。
df.merge(pd.DataFrame(df.groupby('_a')._b.nunique()), left_on='_a', right_index=True)
分解起來,第一件事是對_a進行分組,然后計算_b列中的唯一性。 df.groupby('_a')._b.nunique()
這樣做的。 然后使用_a作為鍵將其與原始數據幀合並。 groupby返回一個序列,因此我們需要在合並之前將其轉換為數據pd.DataFrame
,因此將pd.DataFrame
轉換pd.DataFrame
數據pd.DataFrame
。
編輯
上面@COLDSPEED的答案比這個答案有效得多。 為了給出速度差的概念,我運行了一個timeit,它顯示了在這個小數據幀上的速度提高了2倍,在大數據幀上的速度可能會更高。
使用合並:
%timeit df.merge(pd.DataFrame(df.groupby('_a')._b.nunique()), left_on='_a', right_index=True)
1.43 ms ± 74.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
使用轉換:
%timeit df.groupby('_a')['_b'].transform('nunique')
750 µs ± 32 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.