简而言之:我想在所有Pandas数据帧中为所有对象列动态地将对象转换为字符串。我看到有关单个转化的类似帖子,但没有一个涉及动态转换为字符串。
我正在使用Python 3.x将多个JSON文件写入SQL Server数据库。当我导入JSON文件并将其存储在Pandas DF中时,所有字符串都存储为对象,因为预先知道长度。因此,当我将数据写入SQL Server时,数据类型选择为text
而不是varchar(255)
有没有办法动态地将dtype object
的所有列转换为dtype string
?字符串可以在前255个字符处剪切。
我尝试了以下操作,但让Python崩溃......
url = 'some-url-to-json-file'
params['connectionString'] = 'driver://user:pw@server/database'
engine = sqlalchemy.create_engine(connectionString)
response = requests.get(url)
pandasDF = pandas.DataFrame(response.json()['value'])
# Convert Objects to Strings
for cName in list(pandasDF.columns.values):
if pandasDF[cName].dtype == 'object':
pandasDF[cName] = pandasDF[cName].to_string
pandasDF.to_sql(tableName, engine, if_exists = 'append')
答案 0 :(得分:4)
在识别数据框中存在的String
列后,您可以使用 sqlalchemy Text
类型而不是默认的object
类型。
使用to_sql
中的dtype
参数,并提供这些列与sqlalchemy.sql.sqltypes.String
的字典映射,如下所示:
from sqlalchemy.types import String
obj_cols = pandasDF.select_dtypes(include=[object]).columns.values.tolist()
pandasDF.to_sql(tableName, engine, if_exists='append', dtype={c: String for c in obj_cols})
这些会将您的object
数据映射到String
SQL数据类型。
答案 1 :(得分:1)
pandas数据帧没有字符串类型。 “对象”dtype是各种不同类型(如字符串,列表或词典)的全能型。您需要首先使用所需的指定类型在sql server中创建表。您应该使用sql server提供的create table
语句执行此操作。你可以通过sqlalchemy在python中完成所有这些。然后,Pandas应该能够追加与您创建的表中的类型匹配的行。
以下是关于更改pandas dtypes映射的{{3}}。
您始终可以通过指定所需的SQL来覆盖默认类型 使用dtype参数的任何列的类型。这个论点 需要一个字典映射列名到SQLAlchemy类型(或 sqlite3回退模式的字符串)。例如,指定使用 sqlalchemy字符串类型,而不是字符串的默认文本类型 列:
from sqlalchemy.types import String
data.to_sql('data_dtype', engine, dtype={'Col_1': String})
以下是sqlalchemy.types
'ARRAY','BIGINT','BINARY','BLOB','BOOLEAN','BigInteger','Binary','Boolean','CHAR','CLOB','Concatenable','DATE' , 'DATETIME','DECIMAL','Date','DateTime','Enum','FLOAT','Float', 'INT','INTEGER','可索引','整数','间隔','JSON', 'LargeBinary','MatchType','NCHAR','NULLTYPE','NUMERIC', 'NVARCHAR','NullType','数字','PickleType','REAL','SMALLINT', 'STRINGTYPE','SchemaType','SmallInteger','String','TEXT','TIME', 'TIMESTAMP','文字','时间','TypeDecorator','TypeEngine','Unicode', 'UnicodeText','UserDefinedType','VARBINARY','VARCHAR','Variant', '4.1.x或更高版本'