【问题标题】:How to convert if/else to np.where in pandas如何在熊猫中将 if/else 转换为 np.where
【发布时间】:2020-10-06 10:13:40
【问题描述】:

我的代码在下面

将 pd.to_numeric 应用于应该为 int 或 float 但作为对象出现的列。我们可以像应用 np.where 那样将更多转换成 pandas 的方式

if df.dtypes.all() == 'object':
    df=df.apply(pd.to_numeric,errors='coerce').fillna(df)
else:
    df = df

【问题讨论】:

    标签: python pandas numpy fillna


    【解决方案1】:

    一个简单的单行是assignselest_dtypes,它将重新分配现有的列

    df.assign(**df.select_dtypes('O').apply(pd.to_numeric,errors='coerce').fillna(df))
    

    np.where:

    df[:] = (np.where(df.dtypes=='object',
              df.apply(pd.to_numeric,errors='coerce').fillna(df),df)
    

    示例(检查Price 列):

    d = {'CusID': {0: 1, 1: 2, 2: 3},
         'Name': {0: 'Paul', 1: 'Mark', 2: 'Bill'},
         'Shop': {0: 'Pascal', 1: 'Casio', 2: 'Nike'},
         'Price': {0: '24000', 1: 'a', 2: '900'}}
    df = pd.DataFrame(d)
    
    print(df)
       CusID  Name    Shop  Price
    0      1  Paul  Pascal  24000
    1      2  Mark   Casio      a
    2      3  Bill    Nike    900
    
    df.to_dict()
    {'CusID': {0: 1, 1: 2, 2: 3},
     'Name': {0: 'Paul', 1: 'Mark', 2: 'Bill'},
     'Shop': {0: 'Pascal', 1: 'Casio', 2: 'Nike'},
     'Price': {0: '24000', 1: 'a', 2: '900'}}
    

    (df.assign(**df.select_dtypes('O').apply(pd.to_numeric,errors='coerce')
       .fillna(df)).to_dict())
    
    {'CusID': {0: 1, 1: 2, 2: 3},
     'Name': {0: 'Paul', 1: 'Mark', 2: 'Bill'},
     'Shop': {0: 'Pascal', 1: 'Casio', 2: 'Nike'},
     'Price': {0: 24000.0, 1: 'a', 2: 900.0}}
    

    【讨论】:

      【解决方案2】:

      你的 if/else 等价于 df.mask

      df_out = df.mask(df.dtypes =='O', df.apply(pd.to_numeric, errors='coerce')
                                          .fillna(df))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-30
        • 2019-04-09
        • 1970-01-01
        • 2014-04-13
        • 1970-01-01
        • 2018-06-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多