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

时间:2017-11-16 14:57:19

标签: python sql sql-server pandas nan

我需要使用SQL Alchemy将数据帧从pandas导出到Microsoft SQL Server。许多列是字符串,具有缺失值并且具有一些非常长的整数,例如99999999999999999999999999999999999。这些数字是某种外键,因此值本身并不意味着什么,所以我可以将它们转换为字符串。

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

OverflowError: int too big to convert

我尝试使用astype(str)转换为字符串,但后来我遇到了一个问题,即缺少值(标识为nans)被转换为字符串' nan' - 所以SQL不会将它们视为空值,而是将其视为字符串' nan'。

我找到的唯一解决方案是首先转换为str然后替换' nan'与numpy.nan。有没有更好的方法?这很麻烦,相对较慢,并且可以获得unpythonic:首先我将所有内容转换为字符串,转换将空值转换为字符串,因此我将它们转换为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 个答案:

答案 0 :(得分:5)

与替换ie

相比,使用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