检查Pandas数据框列列表中的值

时间:2014-07-29 21:54:25

标签: python pandas

我有一个看起来像这样的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

我想创建一个新的bool列“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 :(得分:3)

@May的答案当然会有效 - 用|运算符来编写它可能会更加标准。

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

如果要检查所有(或多个)列中的值,还可以使用isin,如下所示。 isin检查列表中的值是否在每个单元格中,如果每行中的任何元素为True,则any(1)返回True。

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

编辑: 根据您编辑过的问题,这会有用吗?

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

答案 1 :(得分:0)

我仍然感到困惑。但你想要的部分可能就是这样:

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

答案 2 :(得分:0)

以下是从数据框列返回bool的一些方法的一些%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