簡體   English   中英

計算每組唯一值的數量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM