将非唯一列的非最大行数删除到另一列

2024-04-23 16:51:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道标题很奇怪。但我不知道如何简明扼要地表达这个问题。 假设我有一个DataFrame,有两列,如下所示

    A   B
0   1   a
1   2   b
2   1   a
3   3   c
4   3   c
5   4   d
6   1   b

列A和B是一对多关系。我想删除满足此条件的所有行:对于A列中每个在B列中有多个值的值,如果B列中的值总数不是最大值,则将删除这些行。但是,如果A列中的一个值仅对应于B列中的一个值,或者该值属于最大总计数,则不会删除这些行。别担心,最大计数是唯一的

在本例中,第六项将被删除,因为它不是A中唯一值1的最大值。结果就是这样

    A   B
0   1   a
1   2   b
2   1   a
3   3   c
4   3   c
5   4   d

有什么有效的解决办法吗?我已经尝试了以下步骤:
1.使用nunique
筛选列A和B中的重复值 2.使用B中的多个值获取A中的所有值
3.根据带有count_valuesnlargest
的B列进行计数 4.检查最大值以了解B的值
5.筛选满足值A(在步骤2中)和B(在步骤4中)的行

我觉得步骤太复杂了,我得做手工检查。有更好的解决办法吗


1条回答
网友
1楼 · 发布于 2024-04-23 16:51:56

这是一个棘手的问题,请参见评论中的解释。如果您需要更多解释,请在评论中告诉我:

# count B values per group A and then only keep the row with the highest count
largest_n = df.groupby('A')['B'].value_counts().rename('size')
largest_n = largest_n.reset_index(level=1).groupby('A').head(1)

# join the row with the highest count back 
df = df.set_index('A').join(largest_n['B'], lsuffix='', rsuffix='_largest')

# then check where B in original dataframe == to B highest count
df = df.query('B == B_largest').reset_index().drop(columns='B_largest')

   A  B
0  1  a
1  1  a
2  2  b
3  3  c
4  3  c
5  4  d

相关问题 更多 >