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

熊猫如何不适用于整栏

  •  2
  • Raheel  · 技术社区  · 8 年前
    self.df['Regular Price'] = self.df['Regular Price'].apply(
                lambda x: int(round(x)) if isinstance(
                    x, (int, float)) else None
            )
    

    以上代码为字段的每个值都指定了无 Regular Price 每当它在数据帧中遇到非数字值时。我想分配 None 只有其非数值所在的单元格。

    谢谢

    1 回复  |  直到 8 年前
        1
  •  1
  •   jezrael    8 年前

    首先是不可能的回报 NaN s与 integers 因为 楠 s是 float 按设计。

    如果您的解决方案有效 mixed 类型-带数字的 string s:

    df = pd.DataFrame({
        'Regular Price': ['a',1,2.3,'a',7],
        'B': list(range(5))
    })
    print (df)
       B Regular Price
    0  0             a
    1  1             1
    2  2           2.3
    3  3             a
    4  4             7
    
    df['Regular Price'] = df['Regular Price'].apply(
                lambda x: int(round(x)) if isinstance(
                    x, (int, float)) else None
            )
    
    print (df)
       B  Regular Price
    0  0            NaN
    1  1            1.0
    2  2            2.0
    3  3            NaN
    4  4            7.0
    

    但如果所有数据都是字符串 to_numeric 具有 errors='coerce' 用于将非数字转换为 楠 s:

    df = pd.DataFrame({
        'Regular Price': ['a','1','2.3','a','7'],
        'B': list(range(5))
    })
    print (df)
       B Regular Price
    0  0             a
    1  1             1
    2  2           2.3
    3  3             a
    4  4             7
    
    df['Regular Price'] = pd.to_numeric(df['Regular Price'], errors='coerce').round()
    print (df)
       B  Regular Price
    0  0            NaN
    1  1            1.0
    2  2            2.0
    3  3            NaN
    4  4            7.0
    

    编辑:

    我还需要删除浮点并使用 int 只有

    可以通过转换为 None 对于 楠 s并转换为 整数 :

    df['Regular Price'] = pd.to_numeric(df['Regular Price'],
                                        errors='coerce').round()
    
    df['Regular Price'] = np.where(df['Regular Price'].isnull(), 
                                   None,
                                   df['Regular Price'].fillna(0).astype(int))
    
    print (df)
       B Regular Price
    0  0          None
    1  1             1
    2  2             2
    3  3          None
    4  4             7
    
    
    print (df['Regular Price'].apply(type))
    0    <class 'NoneType'>
    1         <class 'int'>
    2         <class 'int'>
    3    <class 'NoneType'>
    4         <class 'int'>
    Name: Regular Price, dtype: object
    

    但它的性能很慢,所以最好 不要使用它 . 还应该存在另一个问题-soe函数失败,所以最好是 浮动 s如果使用 楠 s:

    测试一些函数,如 diff 在里面 50k rows DataFrame :

    df = pd.DataFrame({
        'Regular Price': ['a','1','2.3','a','7'],
        'B': list(range(5))
    })
    df = pd.concat([df]*10000).reset_index(drop=True)
    print (df)
    
    df['Regular Price'] = pd.to_numeric(df['Regular Price'], errors='coerce').round()
    
    df['Regular Price1'] = np.where(df['Regular Price'].isnull(), 
                                   None,
                                   df['Regular Price'].fillna(0).astype(int))
    

    In [252]: %timeit df['Regular Price2'] = df['Regular Price1'].diff()
    

    类型错误:不支持的操作数类型-:“int”和“NoneType”

    In [274]: %timeit df['Regular Price3'] = df['Regular Price'].diff()
    1000 loops, best of 3: 301 µs per loop
    

    In [272]: %timeit df['Regular Price2'] = df['Regular Price1'] * 1000
    100 loops, best of 3: 4.48 ms per loop
    
    In [273]: %timeit df['Regular Price3'] = df['Regular Price'] * 1000
    1000 loops, best of 3: 469 µs per loop
    

    编辑:

    df=pd。数据帧({
    “正常价格”:[a'、'1'、'2.3'、'a'、'7'],
    “B”:列表(范围(5))
    })
    打印(df)
    B正常价格
    1  1             1
    2  2           2.3
    3.3安
    4  4             7
    
    df[“正常价格”]=pd。to_numeric(df['Regular Price',errors='concure')。圆形()
    打印(df)
    B正常价格
    0 0 NaN
    1  1            1.0
    2  2            2.0
    4  4            7.0
    

    第一个是可能的删除 楠 按列排序 Regular Price 然后转换为 整数 .

    df1 = df.dropna(subset=['Regular Price']).copy()
    df1['Regular Price']  = df1['Regular Price'].astype(int)
    print (df1)
       B  Regular Price
    1  1              1
    2  2              2
    4  4              7
    

    处理你需要的,但不要改变索引。

    #e.g. some process 
    df1['Regular Price']  = df1['Regular Price'] * 100
    

    最后的 combine_first -it添加 楠 到 正常价格 柱

    df2 = df1.combine_first(df)
    print (df2)
         B  Regular Price
    0  0.0            NaN
    1  1.0          100.0
    2  2.0          200.0
    3  3.0            NaN
    4  4.0          700.0