熊猫:如果其中任何行包含特定值,如何删除具有相同唯一ID的行

时间:2018-07-20 18:21:46

标签: python pandas

我有一个数据集,其中包含具有相应数据的唯一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的行。

结果DF:

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

任何帮助或指导都将非常有帮助,如果需要进一步说明,请告诉我!

2 个答案:

答案 0 :(得分:1)

使用 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())]

这给了我们我们想要的结果。

答案 1 :(得分:1)

您可以将索引设置为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