计算每组唯一值的数量

时间:2018-05-10 08:34:15

标签: python pandas dataframe group-by pandas-groupby

我有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

我需要创建列a_b_3(来自列'_b'的唯一计数)使用来自pandas的groupby。提前谢谢。

3 个答案:

答案 0 :(得分:4)

您希望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

答案 1 :(得分:3)

使用 -

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

答案 2 :(得分:1)

如果我理解你想要的是按列_a分组,则计算每个组中_b列中唯一值的数量,然后使用_a作为键将此计数附加到原始数据帧。以下代码应该实现。

sys.argv[1]

将其分解,首先是按_a分组然后计算_b列中的唯一身份。这是df.merge(pd.DataFrame(df.groupby('_a')._b.nunique()), left_on='_a', right_index=True) 的作用。然后使用_a作为键将其与原始数据帧合并。 groupby返回一个系列,因此我们需要在合并之前将其转换为数据帧,因此df.groupby('_a')._b.nunique()

修改

@ COLDSPEED上面的答案比这个答案要高效得多。为了了解速度差异,我设计了一个时间表,在这个小型数据帧上显示速度提高了2倍,在更大的数据帧上,它可能会更多。

使用合并:

pd.DataFrame

使用转换:

%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)