在 pandas 中迭代 3 个条件

Iterate throught 3 conditions in pandas

我有一个数据框,我想迭代 column1 的信息以将其分为三个类别(国家实验室、私人实验室、机构实验室),这些类别将被添加到另一列。Column1 是这样的(示例):

LABORA
-PRIV LAB1
-ARKANSAS
-CDC LAB
-PRINCETON
-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

我的 for 循环是这样的:

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,而任何其他不符合这些的,则转到带有 的 INSTITUTIONAL LABS以前的 名字。

所以,我已经试过了,还是不行。我对 python 的了解是基本的。当 运行 它时,我收到此消息:


 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().

如果有任何帮助,我将不胜感激。抱歉,如果它太基础了,寻找类似的东西但没有找到任何东西。

更新:非常感谢您的帮助。我会在这里发表一些评论。我的数据结构是一个包含 100 列和大约 150 000 行的 csv 文件。我感兴趣的专栏是不同类型的实验室,我只适应了美国,希望它更全面,该专栏中的所有内容都是字符串。

您可以使用布尔索引。这是一个例子:

import pandas as pd

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

现在,应用每个条件,并使用机构的默认值。

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

更新:我在 'Step 0' 中添加了初始化。 lab 列来自原始数据,而 lab-type 只是从 lab 复制而来。然后,我们将更新应用于 lab-type,并更新 rule 列中每次更新的规则(即原因)。

如果规则 == 0,则我们没有足够的信息来更改值。如果规则不是 10 的幂,那么我们不止一次更新了该行。