如何检查 pandas 列中的字符串列表?
How do I check a pandas Column for a list of strings?
数据框看起来像
我一直在寻找一种方法来搜索“父任务”列中的关键字,然后添加一个新列并为其输入类别名称。例如,任何包含关键字(我的项目、学习技能、业务)的行都会在名为类别的列中包含我的项目标签。
当前数据帧(csv 文件):
Start Date,Task Name,Duration (hours),Parent Task
01/02/2021,Sleeping ,1.33639,
02/02/2021,Sleeping ,6.43167,
02/02/2021,coding,0.78028,Learning a skill
02/02/2021,Commute,0.22694,
02/02/2021,reading,1.14778,My_projects
02/02/2021,Commute,0.56139,
02/02/2021,Prep,0.37611,
所需数据框(csv 文件):
Start Date,Task Name,Duration (hours),Parent Task, Category
01/02/2021,Sleeping ,1.33639,,Sleeping
02/02/2021,Sleeping ,6.43167,,Sleeping
02/02/2021,coding,0.78028,Learning a skill,My project
02/02/2021,Commute,0.22694,,Commute
02/02/2021,reading,1.14778,My projects, My project
02/02/2021,Commute,0.56139,, Commute
02/02/2021,Prep,0.37611,, Prep
我一直在尝试应用这个方法:
My_projects_tasks = '|'.join(['My_projects', 'Learning a skill', 'Business'])
if df['Parent Task'].str.contains( My_projects_tasks , na=False):
df['Category'] = 'My_project'
但是我收到这个错误
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
有没有更有效的方法来解决这个问题?因为我要添加多个类别并且有很多行?
然后我想总结每天每个类别的所有持续时间,并在不同的 CSV 文件中显示,但我还没有做到这一点。
谢谢
您可以尝试生成一个 bool series
然后您只需要应用一个函数来添加 My_project
,例如:
from numpy import nan
df['Category'] = df['Parent Task'].isin(['My_projects', 'Learning a skill', 'Business']).apply(lambda x: 'My_project' if x else nan)
IIUC:
尝试通过 fillna()
和 replace()
:
d={'Learning a skill':'My_projects','Business':'My_projects'}
df['Category']=df['Parent Task'].fillna(df['Task Name']).replace(d)
数据框看起来像
我一直在寻找一种方法来搜索“父任务”列中的关键字,然后添加一个新列并为其输入类别名称。例如,任何包含关键字(我的项目、学习技能、业务)的行都会在名为类别的列中包含我的项目标签。
当前数据帧(csv 文件):
Start Date,Task Name,Duration (hours),Parent Task
01/02/2021,Sleeping ,1.33639,
02/02/2021,Sleeping ,6.43167,
02/02/2021,coding,0.78028,Learning a skill
02/02/2021,Commute,0.22694,
02/02/2021,reading,1.14778,My_projects
02/02/2021,Commute,0.56139,
02/02/2021,Prep,0.37611,
所需数据框(csv 文件):
Start Date,Task Name,Duration (hours),Parent Task, Category
01/02/2021,Sleeping ,1.33639,,Sleeping
02/02/2021,Sleeping ,6.43167,,Sleeping
02/02/2021,coding,0.78028,Learning a skill,My project
02/02/2021,Commute,0.22694,,Commute
02/02/2021,reading,1.14778,My projects, My project
02/02/2021,Commute,0.56139,, Commute
02/02/2021,Prep,0.37611,, Prep
我一直在尝试应用这个方法:
My_projects_tasks = '|'.join(['My_projects', 'Learning a skill', 'Business'])
if df['Parent Task'].str.contains( My_projects_tasks , na=False):
df['Category'] = 'My_project'
但是我收到这个错误
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
有没有更有效的方法来解决这个问题?因为我要添加多个类别并且有很多行? 然后我想总结每天每个类别的所有持续时间,并在不同的 CSV 文件中显示,但我还没有做到这一点。 谢谢
您可以尝试生成一个 bool series
然后您只需要应用一个函数来添加 My_project
,例如:
from numpy import nan
df['Category'] = df['Parent Task'].isin(['My_projects', 'Learning a skill', 'Business']).apply(lambda x: 'My_project' if x else nan)
IIUC:
尝试通过 fillna()
和 replace()
:
d={'Learning a skill':'My_projects','Business':'My_projects'}
df['Category']=df['Parent Task'].fillna(df['Task Name']).replace(d)