如何使用pandas.groupby()识别相同的组?

时间:2018-05-31 14:23:44

标签: python pandas dataframe pandas-groupby

我试图使用pandas来识别数据帧的相同子部分。因此,例如,如果我有一个数据框,如:

   id  A  B 
0   1  1  2
1   1  2  3
2   1  5  6
3   2  1  2
4   2  2  3
5   2  5  6
6   3  8  9
7   3  4  0
8   3  9  7

我想按ID进行分组,因此第0 - 2行将形成第1组,第3行第5行将形成第2组,第6 - 8行将形成第3组。我知道我可以使用pd.groupby()来按行分组行。在这种情况下,第2组是第1组的重复(A列和B列在两者中都相同)

我当时想要做的是删除重复的组,所以在这种情况下我想要删除第二组。我的最终数据框将如下所示:

   id  A  B 
0   1  1  2
1   1  2  3
2   1  5  6
6   3  8  9
7   3  4  0
8   3  9  7

重复组中的每一列都相同,但每个组的ID不同。我只想删除一个组,如果它对于组中的每一行相同。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

检查pd.crosstab

s=pd.crosstab(df.id,[df.A,df.B]).drop_duplicates().unstack()
s[s!=0].reset_index().drop(0,1)
Out[128]: 
   A  B  id
0  1  2   1
1  2  3   1
2  4  0   3
3  5  6   1
4  8  9   3
5  9  7   3

答案 1 :(得分:1)

这是使用辅助列和pd.Series.drop_duplicates的一种方法。

我们的想法是首先创建一个从id到表示该id所有行的值元组的映射。然后删除重复项并提取余数的索引。

df['C'] = list(zip(df['A'], df['B']))

s = df.groupby('id')['C'].apply(tuple)\
      .drop_duplicates().index

res = df.loc[df['id'].isin(s), ['id', 'A', 'B']]

print(res)

   id  A  B
0   1  1  2
1   1  2  3
2   1  5  6
6   3  8  9
7   3  4  0
8   3  9  7