多个group-by与一个带有pandas的公共变量?

时间:2014-04-29 05:26:55

标签: pandas

我想在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

基本上AnBn计算每个ID组内的多重性。我怎么能在熊猫中做到这一点?我找到了groupBy,但把所有东西放在一起真是太乱了。我还为ID, AID, B尝试了单独的groupby。也许有一种方法可以先按ID预先分组然后再做所有其他变量? (有很多变量,我有很多人行!)

1 个答案:

答案 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)