【问题标题】:How to update a Pandas datafrae column based on another column value?如何根据另一个列值更新 Pandas 数据框列?
【发布时间】:2021-01-29 21:32:41
【问题描述】:

我有一个来自这样一个 Excel 文件的 pandas df:

col1 col2 col3
aaa aaa xxx
bb bb xxx
ccc 123 yyy
ddd sss NA - Not Listed xxx
ddd sss 34 xxx

如您所见,col1 最后一行的值为“ddd sss”。

如果“col3” = =“xxx”。

换句话说,仅当 col3 == "xxx" 时,将 col2 中的每个“NA”替换为 col1 中的第一个字符串

从“ddd sss”中获取“ddd”不是问题,至少这是可行的:)

感谢您的帮助。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    掩码并填写一段所需的字符串。

    #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
    

    【讨论】:

    • 非常感谢 wwnde,我正在处理用户建议。唯一的问题是,也许我做错了什么,因为它正在更改所有 col2 值,它忽略了“xxx”选择。
    • 它应该可以工作。你是什​​么意思。重新测试,一切正常。
    • 你可以试试这个df['col2']=df.col3.mask((df.col3.eq('xxx')&df.col2.isna()),df.col1.str.split('\s').str[0]) 并告诉我
    • wwnde 我的示例值选择不当,我的“NA”与 nan 无关,完整字符串为“NA - Not Listed”。我会回顾我所做的,因为我提到可能是我的错误。我现在做不到,但我会告诉你的。再次感谢!!
    • 请查看我的编辑。很高兴为您提供进一步的帮助
    【解决方案2】:

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

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

    您还可以使用.apply(axis = 1) 定义遍历每一行的函数,检查拆分和nan 并相应地替换为更通用的方法。

    【讨论】:

    • 感谢 WolVes 抽出时间帮助我!唯一的问题是,只有当 'col3' 包含特定值时,我才应该更新 'col2',例如我的示例中的 'xxx'
    【解决方案3】:

    使用 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
    

    【讨论】:

    • 谢谢克里斯,我会试试的。实际上 col1 中第一个空格的位置是可变的,但这不是问题。
    猜你喜欢
    • 2017-11-11
    • 2023-01-04
    • 2012-04-17
    • 2019-10-14
    • 2020-11-26
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多