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

Python 使用字典基于条件的数据帧查找值,python,pandas,dataframe,dictionary,Python,Pandas,Dataframe,Dictionary,我试图根据其他列的内容查找数据帧的某些列中的特定值。 基本上,如果列_1==1中的一行,那么我们希望数据在同一行,列_2中。 我有很多要查找的值,所以我将它们存储在字典中,因为这似乎是解决问题的直观方法,但我无法让我的函数保持不变。我对功能还不是很在行 输入示例: | patient_id | delirium_date | delirium_sae | syncope_date | syncope_sae | tia_date | tia_sae | |------------|-----

我试图根据其他列的内容查找数据帧的某些列中的特定值。 基本上,如果列_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行或空列


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

因为正确的工作需要匹配字典的所有键和值

想法是通过字典键选择所有列,通过
1
进行比较,并重命名列,以匹配通过dictionary中的值选择的列:

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

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

我刚试过你的答案,效果很好。它保留了数据帧的其余部分,因此我可以将其用于进一步的操作。to_numpy函数有什么帮助?@JesperMølgaard
DataFrame.to_numpy
将数据帧转换为numpy数组,这样我们就不必在使用
DataFrame.mask
时重命名列,非常感谢。这就产生了我想要的结果。我需要更好地使用面具。我没有想到要重命名(u sae)列并以这种方式使用掩码。代码不错。
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