熊猫isin多列

法比安·吉尔斯(Fabian Zills)

我想选择数据框中包含列表中定义的值的所有行。我有两种方法都无法按预期方式使用。

我的数据框看起来像这样:

Timestamp DEVICE READING VALUE
1 | DEV1 | READ1 | randomvalue
2 | DEV1 | READ2 | randomvalue
3 | DEV2 | READ1 | randomvalue
4 | DEV2 | READ2 | randomvalue
5 | DEV3 | READ1 | randomvalue

并且我得到了如下列表(ls):

[[DEV1, READ1], [DEV1, READ2], [DEV2,READ1]]

在这种情况下,我要删除行45

我的第一种方法是:

df = df[(df['DEVICE']. isin([ls[i][0] for i in range(len(ls))])) &
        (df['READING'].isin([ls[k][1] for k in range(len(ls))]))]

这个问题显然是因为它没有删除第4行,因为DEV2具有READING READ2,但是应该删除它。

我的第二种方法是:

df = df[(df[['DEVICE','READING']].isin({'DEVICE':  [ls[i][0] for i in range(len(ls))],
                                        'READING': [ls[i][1] for i in range(len(ls))] }))]

此选择正确的行,但不会删除其他行。相反,它将所有其他单元格设置为NaN,包括我确实希望保留的VALUE ROW。而且它不会同时累积,因此第4行看起来像4 |DEV2|NaN|NaN

解决此问题的最简单或最佳方法是什么?你能帮助我吗?

〜法比安

瓦沙里

您可以将列表转换为元组列表。将数据框中的所需列转换为元组并使用isin

l = [['DEV1', 'READ1'], ['DEV1', 'READ2'], ['DEV2','READ1']]
l = [tuple(i) for i in l]
df[df[['DEVICE', 'READING']].apply(tuple, axis = 1).isin(l)]

你得到

    Timestamp   DEVICE  READING VALUE
0   1   DEV1    READ1   randomvalue
1   2   DEV1    READ2   randomvalue
2   3   DEV2    READ1   randomvalue

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章