【发布时间】:2020-06-04 18:48:47
【问题描述】:
我最近发布了一个关于如何使用 R 进行子集化的问题:Subset dataframe in R based on a list specified in a vector (using a 'starts with' expression or equivalent)
用户@Ric S 非常友好地提供了这个问题的 R 答案。 R的解决方案是:
library(dplyr)
df %>%
filter_at(vars(-ID), any_vars(grepl(paste(medications, collapse = "|"), .)))
不过,我的印象是 Python 可能更省时。总结一下,我试图在超过 100 万行和子集的数据集中识别任何参与者规定的他汀类药物。我有一个列表,其中包含这些药物的所有代码(我只是为了演示目的编了一些代码),接下来我想搜索数据框并将其子集给任何拥有“以”开头的药物代码的人" 任何 列表中的元素。示例中的循环似乎是多余的,但我将为一些药物类别运行此代码。
示例数据集,名为meds_df:
ID readcode_1 readcode_2 generic_name
1 1001 bxd1 1146785342 Simvastatin
2 1002 <NA> <NA> <NA>
3 1003 <NA> <NA> Pravastatin
4 1004 <NA> <NA> <NA>
5 1005 bxd4 45432344 <NA>
6 1006 <NA> <NA> <NA>
7 1007 <NA> <NA> <NA>
8 1008 <NA> <NA> <NA>
9 1009 <NA> <NA> <NA>
10 1010 bxde <NA> <NA>
11 1011 <NA> <NA> <NA>
预期输出为:
ID readcode_1 readcode_2 generic_name
1 1001 bxd1 1146785342 Simvastatin
3 1003 <NA> <NA> Pravastatin
5 1005 bxd4 45432344 <NA>
10 1010 bxde <NA> <NA>
到目前为止,我的代码基于其他 stackoverflow 问题,我还需要在此处嵌入 any() 或等效项:
list_to_extract = ["bxd", "Simvastatin", "1146785342", "45432344", "Pravastatin"]
variable_list = ['statins']
for m in variable_list:
print('extracting individuals prescribed %s' %m)
test = meds_df.loc[meds_df['readcode_1', 'readcode_2','generic_name'].str.startswith(list_to_extract, na=False)]
print(test)
收到错误:
KeyError: ('readcode_1', 'readcode_2','generic_name')
任何帮助将不胜感激!
【问题讨论】:
-
尝试在列名周围添加一组额外的括号以进行索引,如下所示:
meds_df[['readcode_1', 'readcode_2','generic_name']].str.startswith( ... ) -
@bug_spray 不幸的是,当您按列列表进行切片时,它将返回一个 DataFrame 对象,该对象没有可用的
str方法(直到您到达系列级别)。 -
@r.ook 你是对的。我不知何故忽略了这一点
标签: python pandas dataframe subset