检查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
我想创建一个新的布尔列“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)