如果列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的可能用途。
答案 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