Python str.contains基于另一列返回空字符串的值

Python str.contains基于另一列返回空字符串的值,python,pandas,dataframe,Python,Pandas,Dataframe,我需要根据col2中的字符串填充数据帧中的col1,例如: Out[]: Col2 Col1 0 SAP SAP 1 Oracle Oracle 2 N/A 3 SAP SAP 4 SF Salesforce 代码可以工作,但是col1有不属于的值,因为col2是空的。(见第3行) 尝试添加一个pd.np.where(df[column2]str.co

我需要根据col2中的字符串填充数据帧中的col1,例如:

Out[]: 
   Col2      Col1 
0  SAP       SAP     
1  Oracle    Oracle     
2            N/A     
3  SAP       SAP     
4  SF        Salesforce     
代码可以工作,但是col1有不属于的值,因为col2是空的。(见第3行)

尝试添加一个
pd.np.where(df[column2]str.contains(“”,“Empty”)

但是,第1列的所有内容都用“Empty”填充,而忽略了其余部分

这是我的密码:

DF['Col1']= pd.np.where(DF['Col2'].str.contains('Oracle'), 'Oracle',
            pd.np.where(DF['Col2'].str.contains('SAP'), 'SAP',        
            pd.np.where(DF['Col2'].str.contains('SF'), 'Salesforce', 'N/A')))
预期产出为:

Out[]: 
   Col2      Col1 
0  SAP       SAP      
1  Oracle    Oracle     
2            N/A    
3  SAP       SAP      
4  SF        Salesforce     

现在得到您展示的数据框架,我有了一个公平的想法,按照我的方式来做,不过可能会有更好的补充

原始数据帧,如注释部分所示: 因此,您可以使用
Catagory
列上的
str.split()
方法,通过空格分隔符将它们拆分,这将进一步创建四个新列,因为您正在从
Catagory
列中查找起始值,该列将位于必须选择的
0
列中

>>> df['Catagory'].str.split(' ', expand=True)
        0          1     2       3
0  Oracle        IPS  None    None
1     SAP        IPS  FICA  Module
2               None  None    None
3    SAAP        IPS    MM  Module
4      SF  Lightning  None    None
正如您在上面的列
0
中所看到的,仍然有一个空单元格,我们将使用
replace()
方法,但是您将另一个值
SF
转换为
Salesforce
,因此也需要替换,因此,我将使用带有
replace
的dict方法一次性实现这两个目标

解决方案: 因为,我们不需要从
split()
生成的其他列,因此我删除了它们,并使用
assign()
方法将值分配回新列
MGA\u new
,最终删除了不需要的原始列
MGA

如果要再次保留列名
MGA
,可以这样做

>>> df.rename(columns={'MGA_NEW':'MGA'}, inplace=True)
>>> df
              Catagory         MGA
0           Oracle IPS      Oracle
1  SAP IPS FICA Module         SAP
2                          Non-MGA
3   SAAP IPS MM Module        SAAP
4         SF Lightning  Salesforce

希望这会有帮助

现在获得您显示的数据帧,我有了按我的方式进行操作的合理想法,不过可能会有更好的补充

原始数据帧,如注释部分所示: 因此,您可以使用
Catagory
列上的
str.split()
方法,通过空格分隔符将它们拆分,这将进一步创建四个新列,因为您正在从
Catagory
列中查找起始值,该列将位于必须选择的
0
列中

>>> df['Catagory'].str.split(' ', expand=True)
        0          1     2       3
0  Oracle        IPS  None    None
1     SAP        IPS  FICA  Module
2               None  None    None
3    SAAP        IPS    MM  Module
4      SF  Lightning  None    None
正如您在上面的列
0
中所看到的,仍然有一个空单元格,我们将使用
replace()
方法,但是您将另一个值
SF
转换为
Salesforce
,因此也需要替换,因此,我将使用带有
replace
的dict方法一次性实现这两个目标

解决方案: 因为,我们不需要从
split()
生成的其他列,因此我删除了它们,并使用
assign()
方法将值分配回新列
MGA\u new
,最终删除了不需要的原始列
MGA

如果要再次保留列名
MGA
,可以这样做

>>> df.rename(columns={'MGA_NEW':'MGA'}, inplace=True)
>>> df
              Catagory         MGA
0           Oracle IPS      Oracle
1  SAP IPS FICA Module         SAP
2                          Non-MGA
3   SAAP IPS MM Module        SAAP
4         SF Lightning  Salesforce

希望这会有帮助

不要使用
str.contains(“”)
你可以考虑使用regex。以下代码使用正则表达式将整个数据帧中的所有空字符串替换为单词“
empty
”:

df.replace(r'^\s*$', 'Empty', regex=True, inplace=True)

不使用
str.contains(“”)
您可以考虑使用regex。以下代码使用正则表达式将整个数据帧中的所有空字符串替换为单词“
empty
”:

df.replace(r'^\s*$', 'Empty', regex=True, inplace=True)

包含(“”)
听起来很危险。它不是为任何字符串返回
True
吗?没有布尔返回,它用“空”字符串填充所有Col1。这就是我所说的,因为
df[column2].str.contains(“”
是所有
真的
np。其中
将用
空的
填充所有内容是的,你是对的。我已经删除了那一行,但是空格被视为“Oracle”
df.loc[df['Col2'].eq(“”,'Col2']='Empty'
包含(“”)听起来很危险。它不是为任何字符串返回
True
吗?没有布尔返回,它用“空”字符串填充所有Col1。这就是我所说的,因为
df[column2].str.contains(“”
是所有
真的
np。其中
将用
空的
填充所有内容是的,你是对的。我已经删除了那一行,但是空格被视为“Oracle”
df.loc[df['Col2'].eq(“”,'Col2']='Empty'
?不幸的是,我需要col1根据Col2中包含某些“关键字”的字符串使用不同的术语。你的代码可以工作,但并不完全符合我的需要,我很感激。NP,我理解。。你能显示实际的数据帧吗?我们可以匹配预期的输出吗?我需要在“Category”列中搜索匹配的字符串,并根据该字符串填充“MGA”列。这就是当前DF输出的样子:这就是我需要它的样子:我最终使用了您的解决方案的一部分,主要是字典思想,而没有分割数据。我克隆了category列,并使用.replace方法应用字典。感谢您很高兴它有帮助,甚至您可以将应用的解决方案放在pot中或作为答案。不幸的是,我需要col1根据col2中包含某些“关键字”的字符串使用不同的术语。你的代码可以工作,但并不完全符合我的需要,我很感激。NP,我理解。。你能显示实际的数据帧吗?我们可以匹配预期的输出吗?我需要在“Category”列中搜索匹配的字符串,并根据该字符串填充“MGA”列。这就是当前DF输出的样子:这就是我需要它的样子:我最终使用了您的解决方案的一部分,主要是字典思想,而没有分割数据。我克隆了category列,并使用.replace方法应用字典。谢谢你很高兴它有帮助,甚至你可以把你申请的解决方案放在壶上或作为答案。