簡體   English   中英

使用正則表達式過濾熊貓數據框列有異常

[英]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_usedrugB_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

有一些列名約定要堅持:

  1. status_drug_use始終存在。
  2. 匹配列( drugA_usedrugB_use )始終遵循模板<ANYTHING>_use

變更還有第二種情況,我想在用戶定義的字符串(例如analgesic )和兩列drugA_usedrugB_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_useall_use中的值匹配的行
  • 如果原始數據框中的任何行有多個匹配項,請使用drop_duplicates消除行(例如,如果drugA_usedrugB_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM