python - 如何将具有缺失值的列转换为字符串?

标签 python sql-server pandas string nan

我需要使用 SQL Alchemy 将数据框从 pandas 导出到 Microsoft SQL Server。许多列是字符串,缺少值和一些非常长的整数,例如99999999999999999999999999999999。这些数字是某种外键,因此值本身没有任何意义,所以我可以将它们转换为字符串。

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

OverflowError: int too big to convert

我尝试使用 astype(str) 转换为字符串,但随后我遇到了缺失值(标识为 nans)被转换为字符串“nan”的问题 - 因此 SQL 看不到它们为空值,但为字符串“nan”。

我找到的唯一解决方案是先转换为 str,然后将“nan”替换为 numpy.nan。有更好的方法吗?这很麻烦,相对较慢,而且尽可能不符合 Python 规范:首先我将所有内容都转换为字符串,转换将空值转换为字符串,因此我将它们转换为 NaN,它可以是只 float ,我最终得到一个混合类型的列。

或者我只是不得不接受它并接受 pandas 在处理缺失值方面的可怕之处?

下面是一个例子:

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)

df.to_sql('test_df_mixed_types', engine, schema='dbo', if_exists='replace')

最佳答案

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

关于python - 如何将具有缺失值的列转换为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47332799/

相关文章:

mysql - 根据当前表中的相同数据向表中插入数据

python - 如何从长表中有效地创建 SparseDataFrame?

python - 在dask数据帧上使用groupby

python - on_message 事件的 Discord py Cog 问题,不起作用

python - 如何在绘图中为一个 x 值绘制具有多个 y 值的折线图?

python - Pandas - 如何识别系列中的 `nan` 值

python - 在 pandas DataFrame 的每一列中找到第一个非零值

python - 使用 mongodb 与 hyperopt 进行并行评估不起作用

.net - 使用 .Net 3.5 程序集 SQL 2005 CLR?

json - OPENJSON 在 Azure SQL DB 中无法识别