代码之家  ›  专栏  ›  技术社区  ›  Pythonista anonymous

熊猫:如何将缺少值的列转换为字符串?

  •  11
  • Pythonista anonymous  · 技术社区  · 7 年前

    在尝试导出到SQL时,这会导致SQL Alchemy中出现以下错误:

    OverflowError: int too big to convert
    

    我尝试用astype(str)转换为字符串,但后来遇到了一个问题,即缺少的值(标识为nan)被转换为字符串“nan”——因此SQL不会将其视为null,而是将其视为字符串“nan”。

    我找到的唯一解决方案是首先转换为str,然后用numpy替换“nan”。楠。有更好的方法吗? 这很麻烦,速度相对较慢,并且尽可能不连贯:首先我将所有内容转换为字符串,转换将null转换为字符串,因此我将它们转换为NaN,NaN只能是浮点型,最后是一个混合类型列。

    还是我必须接受它,接受熊猫在处理缺失的价值观方面是可怕的?

    我举了一个例子:

    import numpy as np, pandas as pd, time
    
    from sqlalchemy import create_engine, MetaData, Table, select
    import sqlalchemy as sqlalchemy
    
    start=time.time()
    ServerName = "DESKTOP-MRX\SQLEXPRESS"
    Database = 'MYDATABASE'
    params = '?driver=SQL+Server+Native+Client+11.0'
    engine = create_engine('mssql+pyodbc://' + ServerName + '/'+ Database + params, encoding ='latin1' )
    conn=engine.connect()
    
    df=pd.DataFrame()
    df['mixed']=np.arange(0,9)
    df.iloc[0,0]='test'
    df['numb']=3.0
    df['text']='my string'
    df.iloc[0,2]=np.nan
    df.iloc[1,2]=999999999999999999999999999999999
    
    df['text']=df['text'].astype(str).replace('nan',np.nan)
    
    print(df)
    
    df.to_sql('test_df_mixed_types', engine, schema='dbo', if_exists='replace')
    
    1 回复  |  直到 7 年前
        1
  •  18
  •   Bharath M Shetty    7 年前

    使用 np.where 肯定会比替换快一点,即

    df['text'] = np.where(pd.isnull(df['text']),df['text'],df['text'].astype(str))
    

    时间安排:

    %%timeit
    df['text'].astype(str).replace('nan',np.nan)
    1000 loops, best of 3: 536 µs per loop
    
    %%timeit
    np.where(pd.isnull(df['text']),df['text'],df['text'].astype(str))
    1000 loops, best of 3: 274 µs per loop
    
    x = pd.concat([df['text']]*10000)
    %%timeit
    np.where(pd.isnull(x),x,x.astype(str))
    10 loops, best of 3: 28.8 ms per loop
    
    %%timeit
    x.astype(str).replace('nan',np.nan)
    10 loops, best of 3: 33.5 ms per loop