我想在ID组中标记重复值。例如
ID A B
i1 a1 b1
i1 a1 b2
i1 a2 b2
i2 a1 b2
应该成为
ID A An B Bn
i1 a1 2 b1 1
i1 a1 2 b2 2
i1 a2 1 b2 2
i2 a1 1 b2 1
基本上An
和Bn
计算每个ID
组内的多重性。我怎么能在熊猫中做到这一点?我找到了groupBy
,但把所有东西放在一起真是太乱了。我还为ID, A
和ID, B
尝试了单独的groupby。也许有一种方法可以先按ID
预先分组然后再做所有其他变量? (有很多变量,我有很多人行!)
答案 0 :(得分:2)
此外,我尝试使用个人groupby获取ID,A和ID,B
我认为这是解决问题的直接方式;如您所知,您可以分别groupby
,然后计算组的大小。并使用transform
,以便您可以轻松地将结果添加到原始数据框:
df['An'] = df.groupby(['ID','A'])['A'].transform(np.size)
df['Bn'] = df.groupby(['ID','B'])['B'].transform(np.size)
print df
ID A B An Bn
0 i1 a1 b1 2 1
1 i1 a1 b2 2 2
2 i1 a2 b2 1 2
3 i2 a1 b2 1 1
当然,你可以做很多专栏:
for col in ['A','B']:
df[col + 'n'] = df.groupby(['ID',col])[col].transform(np.size)
duplicated
方法也可用于为您提供类似的内容,但它会在第一个内容中将观察结果标记为重复:
for col in ['A','B']:
df[col + 'n'] = df.duplicated(['ID',col])
print df
ID A B An Bn
0 i1 a1 b1 False False
1 i1 a1 b2 True False
2 i1 a2 b2 False True
3 i2 a1 b2 False False
编辑:提高大数据的效果。我是在一个大型数据集(400万行)上完成的,如果我通过以下内容避免使用transform
它会明显更快(它不那么优雅):
for col in ['A','B']:
x = df.groupby(['ID',col]).size()
df.set_index(['ID',col],inplace=True)
df[col + 'n'] = x
df.reset_index(inplace=True)