我试图使用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不同。我只想删除一个组,如果它对于组中的每一行相同。任何帮助将不胜感激!
答案 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