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