遍历熊猫的3种条件

时间:2020-08-06 03:48:20

标签: pandas loops classification

我有一个数据框,我想遍历column1的信息以将其分为三个类别(国家实验室,私人实验室,机构实验室),这些类别将添加到另一列中.Column1就像这样(示例):

LABORA
-PRIV LAB1
-ARKANSAS
-CDC LAB
-PRINCETON
-LAB
-PRIV LAB 2
-佛罗里达州

以此类推...

我的代码(至少是相关部分)是这样的:

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,其他不满足这些条件的其他变量,都以其上一个名称。

所以,我尝试过并且无法获得它。我对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().

我将不胜感激。很抱歉,如果它太基础了,正在寻找类似的东西,却找不到任何东西。

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

1 个答案:

答案 0 :(得分:0)

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

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列中更新每次更新的规则(即原因)。

如果rule == 0,则我们没有足够的信息来更改值。如果该规则的乘方不是10的幂,那么我们将对该行进行多次更新。