如何遍历 pandas 数据框、检查条件、执行字符串操作并写入新列?
How to loop through pandas dataframe, check conditions, perform string manipulations & write to a new column?
我有一个如下所示的数据框;
--------------------------------
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
我使用 iterrows 和条件语句尝试了以下循环代码;
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 中的值并不像预期的那样,如下所示。
另外,我收到这样的警告
"main: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
给我任何 help/suggestions.
对于您的情况,我建议使用 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
。
我觉得你可以做到
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
我有一个如下所示的数据框;
--------------------------------
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
我使用 iterrows 和条件语句尝试了以下循环代码;
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 中的值并不像预期的那样,如下所示。 另外,我收到这样的警告 "main: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
给我任何 help/suggestions.
对于您的情况,我建议使用 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
。
我觉得你可以做到
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