在 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 的幂,那么我们不止一次更新了该行。
我有一个数据框,我想迭代 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 的幂,那么我们不止一次更新了该行。