2016-12-28 11 views
1

要約:すべてのPandasデータフレームのすべてのオブジェクト列に対して、オブジェクトを動的に文字列に変換したいです。 1回のコンバージョンについて同様の投稿がありましたが、どれも文字列へのダイナミックコンバージョンを扱っていません。Python + sqlAlchemy:dtypeオブジェクトを文字列に動的に変更します。

私はPython 3.xを使用して、SQL Serverデータベースに複数のJSONファイルを作成しています。 JSONファイルをインポートしてPandas DFに保存すると、その長さは未知であるため、すべての文字列がオブジェクトとして保存されます。したがって、私はSQL Serverにデータを書き込む際に、データ型がtextなるように選択されるのではなくvarchar(255)

は、動的にstringをDTYPEするDTYPE objectですべての列を変換する方法がありますか?文字列は、最初の255文字で切り取ることができます。

私はパンダのデータフレームには文字列型がありません...

url = 'some-url-to-json-file' 
params['connectionString'] = 'driver://user:[email protected]/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') 

答えて

2

あなたは、識別した後代わりにデフォルトTextタイプのSQLAlchemyのStringタイプを使用することができますobjectカラムはデータフレーム内に存在します。

to_sqldtype引数を使用して示すように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}) 

これらはString SQLデータ型にあなたのobjectデータをマップします。

1

を、以下を試してみましたが、Pythonのクラッシュを作りました。 'Object' dtypeは、文字列やリスト、辞書などのさまざまな種類のキャッチオールです。最初に、指定したタイプのSQL Serverでテーブルを作成する必要があります。これは、SQL Serverが提供する文のcreate tableで行う必要があります。これは、すべてpython内でsqlalchemyを使って行うことができます。これで、Pandasは、作成したテーブルの型と一致する行を追加することができます。

ここでは、パンダのタイプのマッピングを変更することに関するsection in the documentationがあります。

dtype引数を使用して、任意の列の目的のSQL 型を指定することによって、デフォルトの型をいつでもオーバーライドできます。この引数 には、カラム名をSQLAlchemyタイプにマッピングするディクショナリ(または、sqlite3フォールバックモードの場合は 文字列)が必要です。

from sqlalchemy.types import String 

data.to_sql('data_dtype', engine, dtype={'Col_1': String}) 

そしてここsqlalchemy.types

「アレイ内のすべてのタイプのリストです:たとえば、SQLAlchemyの文字列は、文字列 列のデフォルトのテキスト型の代わりに入力し を使用するように指定しますBigInteger、Binary、Boolean、CHAR、CLOB、Concatenable、DATE、 'DATETIME'、 'BIGINT' 'INTUMER'、 'INDEXER'、 'INTEGER'、 'INTEGER'、 'INTERVAL'、 'INTEGER'、 'DECIMAL'、 'Date'、 'DateTime'、 'Enum'、 'FLOAT'、 'Float'、 'N'、 'NCHAR'、 'NULLTYPE'、 'NUMERIC'、 'NVARCHAR'、 'NullType'、 'Numeric'、 'PickleType'、 'REAL'、 ''、 'JSON'、 '文字列 '、' TEXT '、' TIME '、 ' TIMESTAMP '、' Text '、' Time '、' TypeDecorator '、' TypeEngine '、' Unicodeの」、 'UnicodeText'、 'UserDefinedType'、 'VARBINARY'、 'VARCHAR'、 'バリアント'、 '_Binary'

+0

あなたが推測するテーブルを作成する必要はありません。存在しなければパンダがそれを作成します。既に存在する場合は追加できます。 – MYGz

+0

あなたのクイック返信のためのThx。私は、基礎となるJSONファイルの構造を考慮して、どのようにテーブルを動的に作成できるかという疑問に悩まされています。 sqlalchemyを使用してJSONファイルに指定された変数/データ型を使用してMSSQLでテーブルを作成する簡単な方法はありますか? – Dendrobates

+0

これは実際には1つを作成しますが、目的の構造(varcharsではなくテキスト)で作成しません。 sqlalchemyが提供するto_sql関数を使用して、SQLのテキストではなくvarcharsを選択する簡単な方法はありますか? – Dendrobates

関連する問題