2017-11-16 3 views
1

SQL Alchemy를 사용하여 pandas에서 Microsoft SQL Server로 데이터 프레임을 내 보내야합니다. 많은 열은 문자열이며 누락 된 값과 일부 매우 긴 정수를 포함합니다. 99999999999999999999999999999999999. 이 숫자는 일종의 외래 키이므로 값 자체가 아무 의미도 없으므로 값을 문자열로 변환 할 수 있습니다.팬더 : 누락 된 값이있는 열을 문자열로 변환하는 방법?

SQL에 수출 할 때 이것은 SQL 연금술에서 다음과 같은 오류가 발생합니다

OverflowError: int too big to convert 

내가 astype (STR)를 문자열로 변환 시도,하지만 내가없는 값으로 확인 된 문제로 실행 nans는 문자열 'nan'로 변환되므로 SQL은 해당 문자열을 nulls가 아닌 'nan'문자열로 간주합니다.

내가 찾은 유일한 해결책은 str로 변환 한 다음 'nan'을 numpy.nan으로 바꾸는 것입니다. 더 좋은 방법이 있습니까? 이것은 성 가시고, 상대적으로 느리며, 얻을 수있는만큼 만족스럽지 않습니다. 먼저 모든 것을 문자열로 변환합니다. 변환은 null을 문자열로 변환하므로 NaN으로 변환합니다. NaN은 부동 소수점 일 수 있습니다. 혼합형 컬럼.

아니면 그냥 빠져 나와 팬더가 누락 된 값을 처리하는 데 지독한가요?

내가 아래의 예를 가지고 : np.where 확실히 조금 더 빠른 비교 예

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

타이밍을 대체하는 것입니다 사용

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') 
+0

지정'DTYPE = object' 또는'.astype (object) ' –

+0

열은 이미 객체입니다. –

답변

2

을 :

%%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 
관련 문제