首页 > 解决方案 > 使用字典基于条件的数据框查找值

问题描述

我正在尝试根据其他列的内容在数据框的某些列中查找特定值。基本上,如果 column_1 中的一行 == 1,那么我们想要同一行中的数据,column_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'}

因此,如果任何 column(dict(keys)) 设置为 '1',则获取 column(dict(values)) 所需的输出:

| 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    |              |            |

注意:它不需要保留空的 patient_id 行或空列。

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

标签: pythonpandasdataframedictionary

解决方案


用于DataFrame.mask根据与字典键关联的列来屏蔽与字典值关联的列:

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

推荐阅读