Значения поиска Dataframe на основе условия с использованием словаря - PullRequest
1 голос
/ 05 августа 2020

Я пытаюсь найти определенные c значения в некоторых столбцах фрейма данных на основе содержимого других столбцов. По сути, если строка в столбце_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 (keys)) установлен в '1', тогда получите столбец ( 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    |              |            |

NB: не нужно сохранять пустые строки Patient_id или пустые столбцы.

Как я уже сказал, я плохо умею использовать функции Так что, если кто-то может провести меня медленно, я должен подумать, когда конструирую его, и, надеюсь, в следующий раз смогу сделать свою собственную ...

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Используйте 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
1 голос
/ 05 августа 2020

Для корректной работы необходимо сопоставление всех ключей и значений словаря.

Идея состоит в том, чтобы выбрать все столбцы по ключам словаря, сравнить по 1 и переименовать столбцы для сопоставления столбцов, выбранных значениями словаря в DataFrame.where:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...