【问题标题】:How do I check a pandas Column for a list of strings?如何检查 pandas 列中的字符串列表?
【发布时间】:2021-06-21 22:21:17
【问题描述】:

数据框看起来像

我正在寻找一种方法来搜索父任务列的关键字,然后添加一个新列并为其输入一个类别名称。例如,任何带有关键字(我的项目、学习技能、业务)的行都会在名为“类别”的列中有一个“我的项目”标签。

当前数据帧(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 文件中显示,但我还没有做到这一点。 谢谢

【问题讨论】:

  • 请在文本中包含您的 df,以便轻松复制以重现您的问题。还要发布您想要的 df,因为很难理解您的目标是什么。

标签: python pandas dataframe filtering


【解决方案1】:

IIUC:

通过fillna()replace() 尝试:

d={'Learning a skill':'My_projects','Business':'My_projects'}
df['Category']=df['Parent Task'].fillna(df['Task Name']).replace(d)

【讨论】:

    【解决方案2】:

    您可以尝试生成 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)
    

    【讨论】:

    • 这确实有效,但我现在如何添加多个类别。如果您将其写为 If 语句,则可以使用它,但我不确定如何将其写为 if 语句。
    猜你喜欢
    • 2013-08-01
    • 2019-10-03
    • 2019-04-20
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    相关资源
    最近更新 更多