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