我有一个数据框,我想遍历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万行。我感兴趣的专栏是不同类型的实验室,我只是将其适应于美国,希望它更加全面,该专栏中的所有内容都是字符串。
答案 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的幂,那么我们将对该行进行多次更新。