从 Pandas DataFrame 中选择一列中具有相同值但另一列中具有不同值的行

tin*_*248 4 python select rows dataframe pandas

假设我有下面的 Pandas DataFrame:

   A      B     C   D
1  foo    one   0   0
2  foo    one   2   4
3  foo    two   4   8
4  cat    one   8   4
5  bar    four  6  12
6  bar    three 7  14
7  bar    four  7  14
Run Code Online (Sandbox Code Playgroud)

我想选择在 A 中具有相同值但在 B 中具有不同值的所有行。所以我希望我的代码的输出是:

   A      B    C   D
1  foo    one  0   0
3  foo    two  4   8
5  bar  three  7  14
6  bar    four 7  14
Run Code Online (Sandbox Code Playgroud)

执行此操作的最有效方法是什么?我有大约 11,000 行,列值有很多变化,但这种情况经常出现。在我的数据集中,如果 A 列中的元素相等,那么相应的 B 列值也应该相等,但是由于错误标记,情况并非如此,我想解决这个问题,我这样做是不切实际的一。

Kar*_*mar 6

你可以试试 groupby()+ filter+ drop_duplicates()

>>> df.groupby('A').filter(lambda g: len(g) > 1).drop_duplicates(subset=['A', 'B'], keep="first")
     A      B  C   D
0  foo    one  0   0
2  foo    two  4   8
4  bar   four  6  12
5  bar  three  7  14
Run Code Online (Sandbox Code Playgroud)

或者,如果你想列子集之间下降重复AB然后可以在下面使用,但将有有行cat也。

>>> df.drop_duplicates(subset=['A', 'B'], keep="first")
     A      B  C   D
0  foo    one  0   0
2  foo    two  4   8
3  cat    one  8   4
4  bar   four  6  12
5  bar  three  7  14
Run Code Online (Sandbox Code Playgroud)


Dan*_*ejo 4

使用groupby +过滤器+ head

result = df.groupby('A').filter(lambda g: len(g) > 1).groupby(['A', 'B']).head(1)
print(result)
Run Code Online (Sandbox Code Playgroud)

输出

     A      B  C   D
0  foo    one  0   0
2  foo    two  4   8
4  bar   four  6  12
5  bar  three  7  14
Run Code Online (Sandbox Code Playgroud)

第一个分组和过滤器将删除没有重复A值的行(即cat),第二个将创建具有相同值的组A, B,并为每个组获取第一个元素。