Pandas 有多个列

Fab*_*lls 7 python pandas

我想选择数据框中包含列表中定义的值的所有行。我有两种方法都不能按预期/想要的那样工作。

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

Timestamp DEVICE READING VALUE
1 | DEV1 | READ1 | randomvalue
2 | DEV1 | READ2 | randomvalue
3 | DEV2 | READ1 | randomvalue
4 | DEV2 | READ2 | randomvalue
5 | DEV3 | READ1 | randomvalue
Run Code Online (Sandbox Code Playgroud)

我有如下列表(ls):

[[DEV1, READ1], [DEV1, READ2], [DEV2,READ1]]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我想删除行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))]))]
Run Code Online (Sandbox Code Playgroud)

这个问题很明显,它没有删除第 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))] }))]
Run Code Online (Sandbox Code Playgroud)

这一行选择了正确的行,但不会删除其他行。相反,它将所有其他单元格设置为 NaN,包括我想要保留的 VALUE ROW。它不会同时累积,所以第 4 行看起来像4 |DEV2|NaN|NaN

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

~法比安

Vai*_*ali 11

您可以将列表转换为元组列表。将数据框中所需的列转换为元组并使用 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)]
Run Code Online (Sandbox Code Playgroud)

你得到

    Timestamp   DEVICE  READING VALUE
0   1   DEV1    READ1   randomvalue
1   2   DEV1    READ2   randomvalue
2   3   DEV2    READ1   randomvalue
Run Code Online (Sandbox Code Playgroud)


Mat*_*nik 5

可以使用多索引来解决这个问题。

values = [['DEV1', 'READ1'], ['DEV1', 'READ2'], ['DEV2', 'READ1']]
# DataFrame.loc requires tuples for multi-index lookups
index_values = [tuple(v) for v in values]

filtered = df.set_index(['DEVICE', 'READING']).loc[index_values].reset_index()
print(filtered)

  DEVICE READING  Timestamp        VALUE
0   DEV1   READ1          1  randomvalue
1   DEV1   READ2          2  randomvalue
2   DEV2   READ1          3  randomvalue  
Run Code Online (Sandbox Code Playgroud)