Python 如何基于另一列值更新数据帧列?

Python 如何基于另一列值更新数据帧列?,python,pandas,Python,Pandas,我有一个Excel文件中的文件,如下所示: 可乐 可乐 可乐 aaa aaa xxx bb bb xxx ccc 123 yyy ddd-sss NA-未列出 xxx ddd-sss 34 xxx 最简单的答案是使用不同的分隔符,但如果不能这样做: df['col2'].fillna(df['col1']) df['col2'] = df['col2'].apply(lambda x: x.split()[-1]) 您还可以定义一个函数,该函数以.applyaxis=1遍历每一行,检查拆分和n

我有一个Excel文件中的文件,如下所示:

可乐 可乐 可乐 aaa aaa xxx bb bb xxx ccc 123 yyy ddd-sss NA-未列出 xxx ddd-sss 34 xxx
最简单的答案是使用不同的分隔符,但如果不能这样做:

df['col2'].fillna(df['col1'])
df['col2'] = df['col2'].apply(lambda x: x.split()[-1])

您还可以定义一个函数,该函数以.applyaxis=1遍历每一行,检查拆分和nan,并相应地替换以获得更通用的方法。

最简单的答案是使用不同的分隔符,但如果您不能这样做:

df['col2'].fillna(df['col1'])
df['col2'] = df['col2'].apply(lambda x: x.split()[-1])
您还可以定义一个函数,该函数以.applyaxis=1遍历每一行,检查拆分和nan,并相应地替换以获得更通用的方法。

使用numpy。其中:

df['col2'] = np.where((df['col3'] == 'xxx') & (df['col2'].isna()),
                      df['col1'].str[:3], df['col2']) # str[:3] assumes that you only want the first three characters


      col1 col2 col3
0      aaa  aaa  xxx
1       bb   bb  xxx
2      ccc  123  yyy
3  ddd sss  ddd  xxx
使用numpy.where:

df['col2'] = np.where((df['col3'] == 'xxx') & (df['col2'].isna()),
                      df['col1'].str[:3], df['col2']) # str[:3] assumes that you only want the first three characters


      col1 col2 col3
0      aaa  aaa  xxx
1       bb   bb  xxx
2      ccc  123  yyy
3  ddd sss  ddd  xxx

遮罩并填充所需的一段字符串

#df['col2']=df.col3.mask(df.col3.eq('xxx'),df.col1.str.split('\s').str[0]) initial answer before edit changes
解决方案

df['col2']=df.col2.mask(df.col3.eq('xxx')&df.col2.str.contains('NA - Not Listed'),df.col1.str.split('\s').str[0])
结果

      col1 col2 col3
0      aaa  aaa  xxx
1       bb   bb  xxx
2      ccc  123  yyy
3  ddd sss  ddd  xxx
4  ddd sss   34  xxx

遮罩并填充所需的一段字符串

#df['col2']=df.col3.mask(df.col3.eq('xxx'),df.col1.str.split('\s').str[0]) initial answer before edit changes
解决方案

df['col2']=df.col2.mask(df.col3.eq('xxx')&df.col2.str.contains('NA - Not Listed'),df.col1.str.split('\s').str[0])
结果

      col1 col2 col3
0      aaa  aaa  xxx
1       bb   bb  xxx
2      ccc  123  yyy
3  ddd sss  ddd  xxx
4  ddd sss   34  xxx

谢谢你抽出时间来帮助我!唯一的问题是,只有当“col3”包含特定值时,我才应该更新“col2”,如我的示例中的“xxx”。感谢狼群花时间来帮助我!唯一的问题是,只有当“col3”包含特定值时,我才应该更新“col2”,比如我的示例中的“xxx”。谢谢Chris,我会尝试一下。实际上,col1中第一个空格的位置是可变的,但这不是问题。谢谢Chris,我会试试的。实际上,col1中第一个空格的位置是可变的,但这不是问题。非常感谢wwnde,我正在研究用户建议。唯一的问题是,可能我做错了什么,因为它正在更改所有col2值,它忽略了“xxx”选择。它应该可以工作。你什么意思?重新测试,一切正常。你能试试这个df['col2']=df.col3.maskdf.col3.eq'xxx'&df.col2.isna,df.col1.str.split'\s'.str[0]吗?让我知道我选错了示例的值,我的NA与nan无关,完整的字符串是NA-未列出。我将回顾我所做的,正如我提到的,可能是我的错误。我现在不能做,但我会让你知道的。再次感谢!!请看我的编辑。很高兴帮助您,非常感谢wwnde,我正在研究用户建议。唯一的问题是,可能我做错了什么,因为它正在更改所有col2值,它忽略了“xxx”选择。它应该可以工作。你什么意思?重新测试,一切正常。你能试试这个df['col2']=df.col3.maskdf.col3.eq'xxx'&df.col2.isna,df.col1.str.split'\s'.str[0]吗?让我知道我选错了示例的值,我的NA与nan无关,完整的字符串是NA-未列出。我将回顾我所做的,正如我提到的,可能是我的错误。我现在不能做,但我会让你知道的。再次感谢!!请看我的编辑。很乐意进一步帮助