代码之家  ›  专栏  ›  技术社区  ›  ViSa

如何在Python中根据条件在两列之间交换值

  •  1
  • ViSa  · 技术社区  · 2 年前

    我正在努力 开关值 之间 Range & Unit 基于以下数据帧的列 如果装置包含 - 然后更换 单位 到 范围 & 范围 到 单位 为此,我正在创建一个 unit_backup 这样我就不会弄丢原件了 单位 价值。

    1.数据帧

    sample_df = pd.DataFrame({'Range':['34-67',12,'gm','45-90'],
                  'Unit':['ml','35-50','10-100','mg']})
    sample_df
    
        Range       Unit
    0   34-67         ml
    1   12         35-50
    2   gm        10-100
    3   45-90         mg
    

    2.功能 下面是我尝试过的代码,但我遇到了错误:

    def range_unit_correction_fn(df):
    
        # creating backup of Unit column
        df['unit_backup'] = df['Unit']
        
        # condition check
        if df['unit_backup'].str.contains("-"):
            
            # if condition is True then replace `Unit` value with `Range` and `Range` with `unit_backup`
            df['Unit'] = df['Range']
            df['Range'] = df['unit_backup']
            
        else:
            # if condition False then keep the same value
            df['Range'] = df['Range']
        
        # drop the backup column
        df = df.drop(['unit_backup'],axis=1)
        
        return df
    
    1. 在数据帧上应用上述功能
    sample_df = sample_df.apply(range_unit_correction_fn, axis=1)
    sample_df
    

    错误:

       1061 def apply_standard(self):
       1062     if self.engine == "python":
    -> 1063         results, res_index = self.apply_series_generator()
    ...
    ----> 4     if df['unit_backup'].str.contains("-"):
          5         df['Unit'] = df['Range']
          6         df['Range'] = df['unit_backup']
    
    AttributeError: 'str' object has no attribute 'str'
    

    这似乎是个愚蠢的错误,但我不确定我哪里做错了。

    感谢这里的任何帮助。

    1 回复  |  直到 2 年前
        1
  •  0
  •   m-sarabi    2 年前

    当您访问 df['unit_backup'] ,您将得到一个标量字符串值,而不是pandas系列,因此调用 .str 这会引发一个错误。

    要修复它,您可以按行方式直接检查字符串值的条件:

    def range_unit_correction_fn(df):
        # creating backup of Unit column
        df['unit_backup'] = df['Unit']
    
        # condition check
        if '-' in df['unit_backup']:
            # if condition is True then replace `Unit` value with `Range` and `Range` with `unit_backup`
            df['Unit'] = df['Range']
            df['Range'] = df['unit_backup']
    
        # drop the backup column
        df = df.drop(['unit_backup'])
    
        return df
    
        2
  •  0
  •   user19077881    2 年前

    或者,在一行中,不需要临时列或列“备份”:

    sample_df[['Range', 'Unit']] = sample_df[['Unit', 'Range']].where(sample_df['Unit'].str.contains('-'), sample_df[['Range', 'Unit']].values)
    

    这给出了:

        Range Unit
    0   34-67   ml
    1   35-50   12
    2  10-100   gm
    3   45-90   mg