检查Pandas数据框列中值是否存在

2 投票
3 回答
8174 浏览
提问于 2025-04-18 15:15

我有一个叫做 pandas 的数据框,里面的数据长这样:

    MED1    MED2    MED3    MED4    MED5
0   60735   24355   33843   16475   9995
1   10126   5789    17165   90000   90000
2   5789    19675   30553   90000   90000
3   60735   17865   34495   90000   90000
4   19675   5810    90000   90000   90000

我想创建一个新的布尔列“med”,这个列的值是基于 MED1 到 MED5 这几列中是否有 60735 来决定的,也就是如果有这个数字就标记为 True,没有就标记为 False。我正在尝试这样做,但不太确定该怎么实现。

DF['med'] = (60735 in [DF['MED1'], DF['MED2']])

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()

MED1 到 MED5 代表的是病人在医院就诊时所服用的药物。我有大约 20 种药物的列表,需要知道病人是否在服用这些药物。每种药物都有一个编码数字,但也有对应的名字。如果能有一个好的解决方案就好了,但我该如何用 pandas 来实现呢?

drugs = {'drug1':60735, 'drug2':5789}  
for n in drugs.keys():
    DF[n] = drugs[n] in DF[['MED1', 'MED2', 'MED3', 'MED4', 'MED5']]

3 个回答

0

这里有一些关于如何从数据框的某一列返回布尔值的方法的%timeit比较。

In [2]: %timeit df['med'] = [bool(x) if int(60735) in x else False for x in enumerate(df['MED1'])]
1000 loops, best of 3: 379 µs per loop

In [3]: %timeit df['med'] = (df['MED1'] == 60735)
1000 loops, best of 3: 649 µs per loop

In [4]: %timeit df['med'] = df['MED1'].isin([60735])
1000 loops, best of 3: 404 µs per loop
0

我还是有点困惑。不过你想要的部分可能是这个:

import numpy as np
DF['med'] = np.logical_or(DF['MED1'] == 60735, DF['MED2'] == 60735)
4

@Mai的回答当然是可行的 - 用|运算符来写可能更符合标准。

df['med'] = (df['MED1'] == 60735) | (df['MED1'] == 60735)

如果你想在所有(或很多)列中检查某个值,你也可以使用isin,如下所示。isin会检查列表中的值是否在每个单元格里,而any(1)会在每一行中只要有一个元素为真就返回真。

df['med'] = df.isin([60735]).any(1)

编辑:根据你修改后的问题,这样做可以吗?

for n in drugs:
    df[n] = df[['MED1','MED2','MED3','MED4','MED5']].isin([drugs[n]]).any(1)

撰写回答