如果列中至少有一个特定值,则删除所有行

时间:2020-02-12 15:07:32

标签: python dataframe if-statement conditional-statements

如果列id中至少有一个特定值,我试图用Python编写代码以删除对某个worked的所有观察。想想看,好像您想知道一年中从未缺席的雇员一样,因此他/她每天出现都会获得奖金。然后,如果某人缺席1或50天,那也是一样,因为该人那一年没有完美的表现主义。

假设df看起来像这样(df):

  id worked
1 A  yes
2 A  no
3 B  yes
4 B  yes
5 C  no
6 C  no
7 D  yes
8 D  yes

理想的新df应该看起来像这样(df2):

  id worked
3 B  yes
4 B  yes
7 D  yes
8 D  yes
df2 = df1[df1.worked == 'yes']

不执行此操作,因为它将删除id C,但仍会显示1行id A,但至少有一天没有出现。

我想确定如果这样做

df2.id.unique()

只有B和D获得奖金,而不是A,B和D。

为了明确起见,我需要获取df2而不是unique()的列表。那只是为了举例说明df2的可能用途。

2 个答案:

答案 0 :(得分:1)

这里是一个例子。但是,我需要添加一个辅助列:

df['aux_col'] = df.groupby('id')['worked'].transform('nunique')
final_df = df[(df['aux_col'] == 1) & (df['worked'] == 'yes')]
final_df = final_df.drop(columns='aux_col')
print(final_df)

输出:

  id worked
2  B    yes
3  B    yes
6  D    yes
7  D    yes

您仔细检查过:

print(final_df['id'].unique())

返回:

['B' 'D']

答案 1 :(得分:1)

您可以尝试df.duplicated

>>> df2 = df1[df1.duplicated(keep=False)]
>>> df2[df2.worked == 'yes']
  id worked
3  B    yes
4  B    yes
7  D    yes
8  D    yes

或使用逻辑和(&):

>>> f1[df1.duplicated(keep=False) & (df1.worked == 'yes')]
  id worked
3  B    yes
4  B    yes
7  D    yes
8  D    yes
相关问题