我有一个数据集,其中包含具有相应数据的唯一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
任何帮助或指导都将非常有帮助,如果需要进一步说明,请告诉我!
答案 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