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]
我有这个例子,数据集:
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]