过滤掉一列中相同但在数据框中分别在另一列中具有多个值的行

Filter out rows that are the same in one column but have multiple values in another columns respectively in dataframe

假设我有一个包含三列的数据框,例如:

index A B C
1 foo One 1
2 foo Two 2
3 foo Three 3
4 bar One 2
5 bar One 1
6 num Two 3
7 num Three 3

在这种情况下,如何使用 Python Pandas 筛选出 B 列中具有相同值但 C 列中有多个相应值的行?

我需要的行是 1、2、4、5、6,因为 B 列中的“一”在 C 列中有两个对应值(1 和 2),而 B 列中的“二”有两个对应值以及。最后,如果可能的话,我想按 A 列对它们进行分组。

不是优化的解决方案,但可以完成您的工作:

import pandas as pd


# create dataframe
df = pd.DataFrame([['foo','One',1],['foo','Two',2],['foo','Three',3],['bar','One',2], ['bar','One',1],['num','Two',3],['num','Three',3]], index = range(1,8), columns = ['A','B','C'])

# get the unique values present in column B
values = list(df['B'].unique())

result = pd.DataFrame()
# iterate through the unique values and for each unique value check the corresponding values in C
for val in values:
    unique_values = list(df[df['B'] == val]['C'].unique())
    # if the unique values in column C is more than 1, it satisfies your condition and hence can be added into your result dataFrame.
    if len(unique_values) > 1:
        result = result.append(df[df['B'] == val])

print(result)

结果是第 1、2、4、5、6 行。

总是在问题中展示你的作品。

您可以尝试 groupby B 列,然后 filter C 列的 value_counts

out = df.groupby('B').filter(lambda group: len(group['C'].value_counts()) > 1)
print(out)

   index    A    B  C
0      1  foo  One  1
1      2  foo  Two  2
3      4  bar  One  2
4      5  bar  One  1
5      6  num  Two  3