Pandas:如果任何一行包含特定的值,我如何删除具有相同唯一ID的行

2024-09-27 00:19:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据集,它有一个带有相应数据的唯一ID列表,但是一些唯一ID有多行

我试图做的是删除所有具有相同唯一ID的行,如果其中任何一行包含特定值的单个/多个实例

示例DF:

ID      %       Trump Adj
abc123  0.833   Moron
xyz987  0.87    Loser
abc123  0.867   Puppet
abc123  0.812   Incompentent
hij456  0.812   Moron
lmn789  0.837   Senile 
lmn789  0.856   Opposite of Obama
lmn789  0.813   Embarrassing

我想删除'Trump Adj'列中包含'Moron'的任何行以及共享相同ID的任何其他行

结果数据框:

ID      %       Trump Adj
xyz987  0.87    Loser
lmn789  0.837   Senile 
lmn789  0.856   Opposite of Obama
lmn789  0.813   Embarrassing

任何帮助或指导都会非常有帮助,如果需要进一步澄清,请告诉我


Tags: of数据id列表abc123obamatrumpadj
2条回答

使用str.contains和布尔掩码:

df[~df['ID'].isin(df.loc[df.TrumpAdj.str.contains('Moron'), 'ID'].unique())]

       ID      %         TrumpAdj
1  xyz987  0.870            Loser
5  lmn789  0.837           Senile
6  lmn789  0.856  OppositeofObama
7  lmn789  0.813     Embarrassing

解释

首先,查找包含单词'Moron'的列:

df.TrumpAdj.str.contains('Moron')

0     True
1    False
2    False
3    False
4     True
5    False
6    False
7    False
Name: TrumpAdj, dtype: bool

然后,找到唯一的ID,它们的形容词包含Moron

df.loc[df.TrumpAdj.str.contains('Moron'), 'ID'].unique()
# array(['abc123', 'hij456'], dtype=object)

最后,找到在我们刚刚创建的列表中'ID'不是的所有行:

df[~df['ID'].isin(df.loc[df.TrumpAdj.str.contains('Moron'), 'ID'].unique())]

这给了我们想要的结果

您可以将索引设置为ID,然后使用drop

df.set_index('ID', inplace=True)

df.drop(df.loc[df['Trump Adj'] == 'Moron'].index)

            %          Trump Adj
ID                              
xyz987  0.870              Loser
lmn789  0.837             Senile
lmn789  0.856  Opposite of Obama
lmn789  0.813       Embarrassing

如果需要,还可以在此之后重置索引,以将ID作为列返回:

df.drop(df.loc[df['Trump Adj'] == 'Moron'].index).reset_index()

       ID      %          Trump Adj
0  xyz987  0.870              Loser
1  lmn789  0.837             Senile
2  lmn789  0.856  Opposite of Obama
3  lmn789  0.813       Embarrassing

相关问题 更多 >

    热门问题