我有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。提前谢谢。
答案 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)