我有一个如下数据框;
--------------------------------
Col1 Col2
--------------------------------
1 AppVer: 1.1.1 | name: A
0 name:B
1 AppVer: 2.3.1 | name: B
我想根据条件创建一个新列(newCol3) 1.如果Col1 = 1,则根据“ |”分割Col2并写入列newCol3 2.如果Col1 = 0,则将“ Not Applicable”写入newCol3列
我尝试了下面的代码使用循环和条件语句进行循环;
for index, row in df1.iterrows():
if row['Col1']==1:
df1['newCol3']="NA"
elif row['Col1']==0:
a=row['Col2'].split("|")
df1['newCol3']=a[0]
但是,我在newCol3中的值不符合预期,如下所示。 另外,我得到这样的警告 “ 主要:8:SettingWithCopyWarning: 试图在DataFrame的切片副本上设置一个值。 尝试改用.loc [row_indexer,col_indexer] = value 请参见文档中的警告:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy”
获得的输出:
---------------------------------------------------
Col1 Col2 newCol3
---------------------------------------------------
1 AppVer: 1.1.1 | name: A 1.1.1
0 name:B 1.1.1
1 AppVer: 2.3.1 | name: B 2.3.1
预期输出:
---------------------------------------------------
Col1 Col2 newCol3
---------------------------------------------------
1 AppVer: 1.1.1 | name: A 1.1.1
0 name:B Not Applicable
1 AppVer: 2.3.1 | name: B 2.3.1
向我提供任何帮助/建议。
答案 0 :(得分:0)
在您的情况下,我建议使用loc
创建一个新列。
文档:loc
文档:str expand
str提取文档:str.extract
df.loc[df['Col1']==1,'Col3'] = df['Col2'].str.extract(pat='insert the pattern here')
df.loc[df['Col1']==0,'Col3'] = 'Not Applicable'
刚刚看到了预期的输出。阅读我链接的文档,并根据需要更改str.extract
。
答案 1 :(得分:0)
我觉得你可以做到
df['New']=df.Col2.str.extract('(\d*\.?\d+\.?\d+)').fillna('Not Applicable')
df
Out[43]:
Col1 Col2 New
0 1 AppVer: 1.1.1 | name: A 1.1.1
1 0 name:B Not Applicable
2 1 AppVer: 2.3.1 | name: B 2.3.1