[英]Using regex to filter pandas dataframe columns with an exception
我正在嘗試通過使用 pd.filter 和正則表達式字符串來子集(檢索一組行)python pandas 數據框,以在根據這些列中的值執行子集之前識別感興趣的列。
例如,這是我的模擬數據框:
id status status_drug_use drugA drugA_use drugB drugB_use
0 1 analgesic 0 None 1 hypertensive
1 0 analgesic 1 analgesic 1 hypertensive
2 0 analgesic 1 hypertensive 0 None
3 1 analgesic 0 None 1 analgesic
我想要包含與status_drug_use
中的值匹配的drugA_use
或drugB_use
列中的值的所有行。 根據示例,這將返回兩行:
id status status_drug_use drugA drugA_use drugB drugB_use
1 0 analgesic 1 analgesic 1 hypertensive
3 1 analgesic 0 None 1 analgesic
有一些列名約定要堅持:
status_drug_use
始終存在。drugA_use
和drugB_use
)始終遵循模板<ANYTHING>_use
。 變更還有第二種情況,我想在用戶定義的字符串(例如analgesic
)和兩列drugA_use
和drugB_use
之間進行比較。 這與使用status_drug_use
的內容不同。
這是一種執行您所要求的方法:
df2 = df.assign(all_use=df.apply(
lambda x: list(x[[col for col in df.columns if col.endswith('_use') and col != 'status_drug_use']]),
axis=1)).explode(
'all_use').query('status_drug_use == all_use').drop_duplicates().drop(columns='all_use')
輸入:
id status status_drug_use drugA drugA_use drugB drugB_use
0 0 1 analgesic 0 None 1 hypertensive
1 1 0 analgesic 1 analgesic 1 hypertensive
2 2 0 analgesic 1 hypertensive 0 None
3 3 1 analgesic 0 None 1 analgesic
輸出:
id status status_drug_use drugA drugA_use drugB drugB_use
1 1 0 analgesic 1 analgesic 1 hypertensive
3 3 1 analgesic 0 None 1 analgesic
解釋:
_use
結尾的所有列的子集(不包括status_drug_use
)all_use
的列,其給定行的值是以_use
結尾的列中的值的列表explode()
添加行,使得對於每個原始行,現在有多個行,一個用於原始行的all_use
中的每個值query()
僅選擇status_drug_use
與all_use
中的值匹配的行drop_duplicates
消除行(例如,如果drugA_use
和drugB_use
都包含“analgesic”,而status_drug_use
也是如此)all_use
因為我們不再需要它。更新:在評論中解決 OP 的問題:“而不是使用列 status_drug_use 中的值,我如何通過使用單個用戶定義的字符串(例如“analgesic”)來實現相同的輸出?
您可以通過將用戶定義的查詢字符串(稱為user_defined_str
)作為變量並通過將列名status_drug_use
替換為帶有@
前綴的變量名來更改query()
的內容來做到這一點: @user_defined_str
(請參閱query()
文檔此處了解更多詳細信息)。
user_defined_str = 'analgesic'
df3 = df.assign(all_use=df.apply(
lambda x: list(x[[col for col in df.columns if col.endswith('_use') and col != 'status_drug_use']]),
axis=1)).explode(
'all_use').query('@user_defined_str == all_use').drop_duplicates().drop(columns='all_use')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.