使用字典基于条件的数据帧查找值

2024-04-25 17:07:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图根据其他列的内容查找数据帧的某些列中的特定值。 基本上,如果列_1==1中的一行,那么我们希望数据在同一行,列_2中。 我有很多要查找的值,所以我将它们存储在字典中,因为这似乎是解决问题的直观方法,但我无法让我的函数保持不变。我对功能还不是很在行

输入示例:

| patient_id | delirium_date | delirium_sae | syncope_date | syncope_sae | tia_date   | tia_sae |
|------------|---------------|--------------|--------------|-------------|------------|---------|
| 1          | 01-08-2020    | 1            |              |             |            |         |
| 1          | 03-08-2020    | 0            |              |             |            |         |
| 2          |               |              | 02-08-2020   | 1           |            |         |
| 2          |               |              | 02-08-2020   | 1           |            |         |
| 3          |               |              |              |             | 04-08-2020 | 1       |
| 3          | 31-07-2020    | 0            | 01-07-2020   | 0           | 20-07-2020 | 0       |
| 3          | 02-08-2020    | 1            |              |             |            |         |

    lookup_dictionary = {'delirium_sae' : 'delirium_date',
                         'syncope_sae'  : 'syncope_date',
                         'tia_sae'      : 'tia_date'}

因此,如果任何列(dict(键))设置为“1”,则获取列(dict(值)) 期望输出:

| patient_id | delirium_date | syncope_date | tia_date   |
|------------|---------------|--------------|------------|
| 1          | 01-08-2020    |              |            |
| 1          |               |              |            |
| 2          |               | 02-08-2020   |            |
| 2          |               | 02-08-2020   |            |
| 3          |               |              | 04-08-2020 |
| 3          |               |              |            |
| 3          | 02-08-2020    |              |            |

注意:它不需要保留空的患者id行或空列

正如我所说,我不擅长使用函数,所以如果有人能慢慢地引导我,我应该在构建函数时思考一下,那么我希望下次可以自己做一个函数


Tags: 数据方法函数id内容date字典直观
2条回答

使用^{}根据与字典键关联的列屏蔽与字典值关联的列:

keys, vals = dct.keys(), dct.values()
df1 = df[['patient_id']].join(df[vals].mask(df[keys].eq(0).to_numpy()))

结果:

print(df1)
   patient_id delirium_date syncope_date    tia_date
0           1    01-08-2020          NaN         NaN
1           1           NaN          NaN         NaN
2           2           NaN   02-08-2020         NaN
3           2           NaN   02-08-2020         NaN
4           3           NaN          NaN  04-08-2020
5           3           NaN          NaN         NaN
6           3    02-08-2020          NaN         NaN

为了正确工作,必须匹配字典的所有键和值

Idea是通过字典的键选择所有列,通过1进行比较,并为通过^{}中的dictional值选择的匹配列重命名列:

lookup_dictionary = {'delirium_sae' : 'delirium_date',
                         'syncope_sae'  : 'syncope_date',
                         'tia_sae'      : 'tia_date'}
 

mask = df[list(lookup_dictionary.keys())].eq(1).rename(columns=lookup_dictionary)
print (mask)
   delirium_date  syncope_date  tia_date
0           True         False     False
1          False         False     False
2          False          True     False
3          False          True     False
4          False         False      True
5          False         False     False
6           True         False     False


df = df[['patient_id']].join(df[list(lookup_dictionary.values())].where(mask))
print (df)
   patient_id delirium_date syncope_date    tia_date
0           1    01-08-2020          NaN         NaN
1           1           NaN          NaN         NaN
2           2           NaN   02-08-2020         NaN
3           2           NaN   02-08-2020         NaN
4           3           NaN          NaN  04-08-2020
5           3           NaN          NaN         NaN
6           3    02-08-2020          NaN         NaN

相关问题 更多 >