Обойти 3 условия в pandas - PullRequest
       65

Обойти 3 условия в pandas

0 голосов
/ 06 августа 2020

У меня есть фрейм данных, и я хочу повторить информацию в столбце 1, чтобы разделить его на три категории (государственные лаборатории, частные лаборатории, лаборатории учреждений), которые будут добавлены в другой столбец. Столбец 1 выглядит следующим образом (пример ):

ЛАБОРА -PRIV LAB1 -АРКАНЗАС -CD C LAB -ПРИНСЕТОН -LAB -PRIV LAB 2 -FLORIDA

и так далее ...

Мой код (по крайней мере, соответствующая часть) выглядит так:

laborat=cov["LABORA"]      #cov is my df, and LABORA the column im interested in
cond1=laborat.str.contains("PRIV", case=False) #condition to look for string PRIV on each cell
cond2= laborat.isin(["STATE 1", "STATE 3",...."STATE N"])  #condition to look for if a string is in a list of states 
cond3= i have no clue

my for l oop выглядит так:

privados=[]

for row in laborat:
    if cond1 == True:
       privados.append("PRIVATE LABS")
    elif cond2 == True:
       privados.append("STATE LABS")
    #else:
     #  privados.append("INSTITUTION LABS")

cov["privados"]= privados

Итак, если строка имеет PRIV строку, переходит в PRIVATE LABS, если строка находится в списке состояний, переходит в STATE LABS, а любая другая, которая не соответствует этим, переходит в ИНСТИТУЦИОНАЛЬНЫЕ ЛАБОРАТОРИИ с своим предыдущим именем.

Итак, я попробовал и не могу получить его. Мои знания о python равны c. При запуске получаю такое сообщение:

 ValueError                                Traceback (most recent call
> last) <ipython-input-22-fa9897c323bc> in <module>
>       2 
>       3 for row in laborat:
> ----> 4     if cond1 == True:
>       5        privados.append("PRIVADOS")
>       6     elif cond2 == True:
> 
> D:\ArchivosProgramas\Anaconda\envs\pandas_playground\lib\site-packages\pandas\core\generic.py
> in __nonzero__(self)    1476     1477     def __nonzero__(self):
> -> 1478         raise ValueError(    1479             f"The truth value of a {type(self).__name__} is ambiguous. "    1480            
> "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
> 
> ValueError: The truth value of a Series is ambiguous. Use a.empty,a.bool(), a.item(), 
> a.any() or a.all().

Я был бы признателен за любую помощь. Извините, если это слишком базовый c, искал что-то похожее и ничего не нашел.

ОБНОВЛЕНИЕ: Большое спасибо за вашу помощь. Я оставлю здесь несколько комментариев. Моя структура данных - это файл csv со 100 столбцами и примерно 150 000 строк. Столбец, который меня интересует, относится к разным типам лабораторий, я адаптировал его только для США, надеясь, что он будет более полным, все в этом столбце - строки.

1 Ответ

0 голосов
/ 06 августа 2020

Вы можете использовать логическое индексирование. Вот пример:

import pandas as pd

df = pd.DataFrame(
    {'lab': ['private lab 1', 'arkansas', 'cdc lab', 
             'princeton', 'lab', 'private lab 2', 'florida']}
)

Теперь примените каждое условие и используйте значение по умолчанию Institution.

states = {'arkansas', 'florida'}

# 0. initialize
df['lab-type'] = df['lab']
df['rule'] = 0

# 1. private labs
mask = df['lab'].str.contains('private', case=False)
df.loc[mask, 'lab-type'] = 'Private'
df.loc[mask, 'rule'] += 1

# 2. state labs
mask = df['lab'].isin(states)
df.loc[mask, 'lab-type'] = 'State'
df.loc[mask, 'rule'] += 10

# 3. default is institutional lab
# df['lab-type'] = df['lab-type'].fillna('Instution')

print(df)


             lab   lab-type  rule
0  private lab 1    Private     1
1       arkansas      State    10
2        cdc lab    cdc lab     0
3      princeton  princeton     0
4            lab        lab     0
5  private lab 2    Private     1
6        florida      State    10

ОБНОВЛЕНИЕ: Я добавил инициализацию в «Шаг 0». Столбец lab взят из исходных данных, а lab-type просто скопирован из lab. Затем мы применяем обновления к lab-type, а также обновляем правило (то есть причину) для каждого обновления в столбце rule.

Если правило == 0, то у нас недостаточно информации для изменить значение. Если правило не является степенью 10, мы обновляли эту строку более одного раза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...