Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Pandas中,是否有一种优雅的方式根据项目是否包含特定字符串来为其指定类别?_Python_Pandas_Csv_Dataframe_Categories - Fatal编程技术网

Python 在Pandas中,是否有一种优雅的方式根据项目是否包含特定字符串来为其指定类别?

Python 在Pandas中,是否有一种优雅的方式根据项目是否包含特定字符串来为其指定类别?,python,pandas,csv,dataframe,categories,Python,Pandas,Csv,Dataframe,Categories,我有一个.csv文件,其中包含以下列标题: 标识符、日期、任务、类别、人员 我想根据任务字符串是否包含多个子字符串中的任何一个子字符串,为每个任务分配一个或多个类别,例如: “会议”、“修复”、“协调”、“参与”、“更新”、“发送”、“参加”、“帮助”、“协助”、“研究”、“创建”、“会议”、“发送”、“开发”、“来源” 我想为每行中的每项任务在“类别”列中写入指定的类别 我尝试了几种不同的方法。例如,我可以让脚本指示任务项中是否存在子字符串,并返回布尔或二进制结果: df['Task'].st

我有一个.csv文件,其中包含以下列标题:

标识符、日期、任务、类别、人员

我想根据任务字符串是否包含多个子字符串中的任何一个子字符串,为每个任务分配一个或多个类别,例如:

“会议”、“修复”、“协调”、“参与”、“更新”、“发送”、“参加”、“帮助”、“协助”、“研究”、“创建”、“会议”、“发送”、“开发”、“来源”

我想为每行中的每项任务在“类别”列中写入指定的类别

我尝试了几种不同的方法。例如,我可以让脚本指示任务项中是否存在子字符串,并返回布尔或二进制结果:

df['Task'].str.contains'work',case=False.fillna0.astypeint

df['Task'].str.contains'work',case=False.fillna0

我还可以让它返回包含子字符串的任务列表:

df[df>0]

但我无法获得将类别写入类别列的代码。我已经尝试了我能找到的所有方法,但我认为我遗漏了一些简单的东西。我对numpy np.where函数很乐观,但没有骰子

非常感谢您的指导

作为pd进口熊猫 将numpy作为np导入 df=pd.read_csv'CAPA Tasks.csv' 测向头 df['Identifier']是唯一的 df=df.set_索引'Identifier' 测向头 df['Task']=df['Task'].astypestr df['Category']=np.其中['Task'].str.包含'work',case=False,work, np.where['Task'].str.包含'corresp',case=False,对应, np.where['Task'].str.包含'order',case=False,order, np.where['Task'].str.包含'met with',case=False,Meet“, ... np.where['Task'].str.包含'receive',case=False,Administration 我认为我无法正确地将任务项转换为字符串,并且开始将代码弄得一团糟

我也试着用if和elseif遍历每一行,但这也不起作用

更新:下面是运行代码,使用@mohanys建议的第二种方法:


import pandas as pd
import matplotlib.pyplot as plt
import numpy as np





df = pd.read_csv('CAPA Tasks.csv')


df['Identifier'].is_unique
df = df.set_index('Identifier')


df['Task'] = df['Task'].astype(str)

df['Category'] = np.select([df['Task'].str.contains('work', case=False), df['Task'].str.contains('corresp', case=False), df['Task'].str.contains('met ', case=False), df['Task'].str.contains('share', case=False), df['Task'].str.contains('made', case=False), df['Task'].str.contains('fix', case=False), df['Task'].str.contains('sent', case=False), df['Task'].str.contains('update', case=False), df['Task'].str.contains('set ', case=False), df['Task'].str.contains('stood up', case=False), df['Task'].str.contains('file', case=False), df['Task'].str.contains('worked with', case=False), df['Task'].str.contains('help', case=False), df['Task'].str.contains('print', case=False), df['Task'].str.contains('develop', case=False), df['Task'].str.contains('partici', case=False), df['Task'].str.contains('attend', case=False), df['Task'].str.contains('talk', case=False), df['Task'].str.contains('plan', case=False), df['Task'].str.contains('order', case=False), df['Task'].str.contains('discuss', case=False), df['Task'].str.contains('taught', case=False), df['Task'].str.contains('teach', case=False), df['Task'].str.contains('writ', case=False), df['Task'].str.contains('research', case=False)],["Develop","Correspond","Meet","Provide","Create","Problem Solve", "Provide", "Maintain & Enhance", "Develop", "Meet", "Administer & Document", "Assist", "Assist", "Produce", "Develop", "Participate", "Meet", "Correspond", "Plan", "Order", "Correspond", "Teach", "Teach", "Write", "Research"])
                          ````

试试这个。你只是在每一瞬间都在列名任务前面缺少df

df['Category'] = np.where(df['Task'].str.contains('work', case=False), "Work",
     np.where(df['Task'].str.contains('corresp', case=False), "Correspond",
              np.where(df['Task'].str.contains('order', case=False), "Order",
                       np.where(df['Task'].str.contains('met with', case=False), "Meet”,.....
您也可以使用np.select而不是np.select。下面只显示了两个项目,您可以将其扩展到尽可能多的项目。这对眼睛来说可能更容易

df['Category'] = np.select([df['Task'].str.contains('work', case=False), df['Task'].str.contains('corresp', case=False)],["Work","Correspond"])
其中masked_df是您的布尔结果

@DerekEden答案

loc[masked_-df,'Category']=='你想要什么' 已关闭,但s/=/=将实际更改“类别”字段

我有一个类似的问题,我想根据“摘要”字段中的任意文本创建一个类别字段。答案如下:

df.loc[df['summary'].str.contains'phishing',case=False,'category']='phishing' 使用np.select看起来更有条理和可读性:

cond_list = [df['Task'].str.contains('within', case=False),
             df['Task'].str.contains('corresp', case=False),
             df['Task'].str.contains('order', case=False),
             df['Task'].str.contains('met with', case=False)]
choice_list = ['Work', 'Correspond', 'Order', 'Meet']

df['Category'] = np.select(cond_list, choice_list)

我认为您已经走上了正确的道路。如果您可以粘贴数据片段和预期输出,您可以将它们粘贴到HTML片段中,建议解决方案会容易得多使用@mohanys建议的第二种方法,这很有效!我已添加了上面的功能代码供参考。将尝试每种方法并报告:-对于第一种方法,我得到了一个错误:ValueError:或者x和y都应该给出,或者两者都不应该给出。但是,你建议的第二种方法似乎是有效的!我现在使用这种方法添加每个类别。当我一切正常时,我将发布最终代码。非常感谢!@dianascher np.wh的语法这里是np.wherecondition、value if condition为true、value if condition为false。在您收到的错误消息中,您错过了其中一个np的value if condition为true或value if condition为false。如果嵌套循环太多,则很容易发生这种情况。请尝试使用“np.where”,仅使用两个嵌套循环并检查我确信它是可行的。然后,你可以扩展到更多的嵌套循环,或者只使用NP.SELL。如果代码帮助你,考虑投票和接受它。谢谢@ DerekEden。我觉得这应该起作用,我试着用一点掩蔽。为了实现你所建议的,我做了以下:MaskddDF= DF[任务].str.contains'work',case=False.fillna0.astypeint>0 masked_df['Task']=df['Task'].astypestr masked_df但我有一个类型错误:TypeError:'Series'对象是可变的,因此它们不能被散列。我将继续推送,看看我是否能让它工作。如果你有建议,你可以发布它
cond_list = [df['Task'].str.contains('within', case=False),
             df['Task'].str.contains('corresp', case=False),
             df['Task'].str.contains('order', case=False),
             df['Task'].str.contains('met with', case=False)]
choice_list = ['Work', 'Correspond', 'Order', 'Meet']

df['Category'] = np.select(cond_list, choice_list)