Python str.contains基于另一列返回空字符串的值
我需要根据col2中的字符串填充数据帧中的col1,例如: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
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方法应用字典。谢谢你很高兴它有帮助,甚至你可以把你申请的解决方案放在壶上或作为答案。