如果行元素包含在另一个行元素中,请选择熊猫行

时间:2019-09-30 15:04:44

标签: python pandas dataframe

我有一个看起来像这样的熊猫数据框:

real_value, prediction
'invalid', 'inv'
'invalid', 'neg'
'invalid', 'inv'
'negative', 'neg'
'negative', 'neg'
'negative', 'neg'
'positive', 'pos'
'positive', 'pos'
'positive', 'inv'

我想选择所有预测和实际值都不匹配的行,换句话说,我想获得一个看起来像的数据框:

real_value, prediction
'invalid', 'neg'
'positive', 'inv'

我尝试了df.loc[~df.prediction.isin(df.real_value)],但这是行不通的。可以根据用户指定的特定值轻松进行选择,例如df.loc[~df.prediction.isin(['neg'])],但是我找不到一种基于行本身中出现的值进行选择的方法。

如何获得所需的选择?谢谢

3 个答案:

答案 0 :(得分:2)

使用以下条件:

df[df['real_value'].str[:3].ne(df['prediction'])]

输出:

    real_value  prediction
1   invalid     neg
8   positive    inv

ne返回不等于series和other。这是元素方面的。您不能使用isin,因为它需要一个可迭代的Series,DataFrame或dict,因此您不会按元素对列real_valueprediction进行比较。

答案 1 :(得分:1)

我希望这会有所帮助。

这也应该有所帮助。 Pandas Flexible Wrappers

df.loc[(df.real_value != df.prediction.astype(str).str[:3])]

根据@WenYoBen的评论,这可能更整洁了

df[df.Prediction.str[:3].ne(df.real_value)]

答案 2 :(得分:1)

您还可以使用mask列来执行此操作,如果预测的长度并不总是相同(这是其他答案所假定的),则mask列会稍微灵活一些:

df['mask'] = [x[1] in x[0] for x in zip(df['real_value'], df['prediction'])]
print(df.loc[df['mask'] == False].drop('mask', axis=1))

返回:

  real_value  prediction
1    invalid         neg  
8   positive         inv