Groupby A 列并提出 A 值,仅当 B 值与其他值不同时,包括空值

Groupby A column and bring up the A value, only if the B values differ from the other ones, including nulls

我有这个例子,数据集:

 A   B 
11   A
11   V
11   C
12   A
12   A
12   A
12   A
13   A
13   A
13   B
13   B
14   C
14   C
14   
14

我想要它 return,分组的 A 值,在 B 列上具有不同的值。所以在这个例子中,预期的输出是:

[11, 13,14]

我尝试制定代码,我成功了,但它很糟糕且未优化。我一直在寻找替代方案,这样我就可以更快地迭代我更大的数据集。非常感谢您的帮助。

这是我的代码:

user_mult_camps = []

for i in  df['A'].unique():
    filt = (df['A'] == i)
    df2 = df.loc[filt]
    x=df2['B'].unique()
    if len(x) > 1:
        user_mult_camps.append(i)
        print(i)

您可以 groupby“A”并使用 nunique 来计算每个“A”的唯一“B”的数量。然后判断是否大于1,过滤对应多个“B”的“A”:

msk = df.groupby('A')['B'].nunique()>1
out = msk.index[msk].tolist()

输出:

[11]

如果您也想计算 NaN,则将 nunique 中的 dropna 参数设置为 False:

df2['B'] = df2['B'].fillna(value=np.nan)
msk = df2.groupby('A')['B'].nunique(dropna=False)>1

然后输出:

[11, 13, 14]

试试这个:

out = df.groupby('A')['B'].nunique().pipe(lambda x: x[x > 1].index.to_numpy())

输出:

>>> out
array([11])

>>> out[0]
11

IIUC,你想确保所有值都不同吗?

您可以使用:

s = df.groupby('A')['B'].apply(lambda s: ~s.duplicated().any())

s[s].index.tolist()

输出:[11]