【问题标题】:Populate column based on other column values in Pandas根据 Pandas 中的其他列值填充列
【发布时间】:2021-05-03 15:26:06
【问题描述】:

我正在尝试根据字段 F1、F2、F3 和 F4 填充字段“结果”。根据哪个字段有值(“-”或“#”除外),需要提取该值并放入“结果”

def fill_values(row):
 if (str(row['F1']) != '-' & str(row['F1']) != '#'):
    return str(row['F1'])
 elif (str(row['F2'] != '-') & str(row['F2'] != '#')):
    return str(row['F2'])
 elif (str(row['F3'] != '-') & str(row['F3'] != '#')):
    return str(row['F3'])
 elif (str(row['F4'] != '-') & str(row['F4'] != '#')):
    return str(row['F4'])
 else:
    return ''

 df['Result'] = df.apply(lambda row : fill_values(row), axis=1)

我收到错误“TypeError: &: 'str' and 'str' 的操作数类型不受支持”。不确定上面的代码出了什么问题。任何线索将不胜感激。

【问题讨论】:

    标签: pandas string lambda


    【解决方案1】:

    这就是所谓的运算符优先级,您需要将() 放在正确的位置:

    if (str(row['F1']) != '-' & str(row['F1']) != '#'):
    

    应该是

    if (str(row['F1']) != '-') & (str(row['F1']) != '#'):
                             ^   ^
                             these
    

    也就是说,更好的方法是:

    df['Result'] = df.replace('-', np.nan).bfill(axis=1).iloc[:,0]
    

    【讨论】:

    • "#" 也需要替换,当要排除更多符号时,替换的用法会很混乱..所以请改用正则表达式..
    • @Hamzausmanghani 仅供参考,replace 接受列表。由于 OP 正在替换整个单元格值,因此最好使用 vanila replace,尽管 replace 有一个选项 regex=True...
    • @MustafaAydın 请重新阅读修复程序。这是完全有效的,因为() 包含一个字符串比较,产生一个布尔值。
    【解决方案2】:
    • 根据名为 mapping_columns 的变量中指定的仅列的每一行获取值列表
    • 使用list comprehension 删除在名为not_consider 的变量中指定的所有值,然后加入该列表以生成单个字符串。
    df = pd.DataFrame({"F1":["-","-","-","-"],"F2":["#1234","#5678","-","#78910"],"F3":["-","-","Unknown","-"],"F4":["-","-","#","-"]})
    
    not_consider = ["-","#"]
    mapping_columns = ["F1","F2","F3","F4"]
    
    df["Result"] = df.apply(lambda x: x[mapping_columns].to_list(), axis = 1)
    df["Result"] = df.Result.apply(lambda x: " ".join([i for i in x if not(i in not_consider) ]))
    
    print(df)
    
           F1    F2        F3 F4   Result
        0  -   #1234        -  -    #1234
        1  -    5678        -  -    #5678
        2  -       -  Unknown  #  Unknown
        3  -  #78910        -  -   #78910
    
    

    【讨论】:

      【解决方案3】:

      你可以试试这个:

      df1 = df.copy(deep=True)
      df1 = df1.replace(to_replace='-', value='')
      df1 = df1.replace(to_replace='#', value='')
      df['result'] = df1.astype(str).sum(axis=1)
      

      【讨论】:

        猜你喜欢
        • 2020-11-14
        • 1970-01-01
        • 2021-06-19
        • 2020-03-16
        • 2019-11-21
        • 2019-09-30
        • 2019-06-06
        • 1970-01-01
        • 2020-02-04
        相关资源
        最近更新 更多