2016-03-25 5 views
2

単一のデータフレームの行の異なる列の値をコンマで区切られた文字列に結合しようとしています。 MySQLデータベースで実行されます。私は67の異なる列を持っていますが、主に異なるサイズのデータ​​フレームのコードの再利用性を最大限にするために、各列の名前を個別に扱うコードを書くことを避けようとしています。私は潜在的にどこでも1から2000の行を反復することができ、各行はINSERTクエリを持っています。パンダは、カスタムのためのデータフレームの列を繰り返します。挿入文字列

RecDate  WindDir  WindSpeed  OutdoorTemperature  OutdoorHumidity 
20160321  121   3    67.5      43.8 
20160322  87   5    73.1      53.2 
20160323  90   2    71.1      51.7 
20160324  103   7    68.3      47.0 

Iはデータフレームの行ごとに文字列を作成したいのです:私のデータフレームは、以下が含まれている場合、例えば

、 INSERTテーブル名値には(20160321、121、3、67.5、43.8 ) テーブル名値にテーブル名値にINSERT(20160322、87、5、73.1、53.2) INSERTテーブル名値に(20160323、90、2、71.1、51.7) INSERT(20160324、103、7、68.3、47.0)

私は、データフレームのto_sql()functi私のデータベース構造で動作するようにコードを取得することができませんでした。

だから、私の目標は、各行をiterrate、および手動でカンマで区切られ、括弧内の文字列を作成することでした。私が試した、

for index, row in df.iterrows(): 
    print('INSERT INTO tablename VALUES (%s, %s, %s, %s, %s)' % (row['RecDate'], row['WindDir'], row['WindSpeed'], row['OutdoorTemperature'], row['OutdoorHumidity'])) 

などの硬質私のコードは、「神託」とないようにするには

for index, row in df.iterrows(): 
    string = '' 

    for x in range(len(row)): 
     string += '%s, ' % row[x] 

    print('INSERT INTO tablename VALUES (%s)' % string) 

を私は日常と上記のコードを結合したエラーのうち、インデックスエラーを取得し、行くには正しいルートが何であるか本当にわからないのです:各列のインデックスの間にカンマを追加し、各行をiterrateします。私は自分のコードと思考プロセスの点検と、コードをどのように改善できるかについてのアドバイスを感謝します。私の目標は、できるだけ効率的にすることです(特に67の列がある場合)、コードの量を最小限に抑えますが、特に列の数が変更された場合は、さまざまな用途に柔軟に対応します。

ありがとうございました!

答えて

0

rowsが数字のインデックスをサポートしていないので、あなたがエラーを取得している

def cq_processor(x): 
    return 'INSERT INTO tablename VALUES ({})'.format(', '.join(x.tolist())) 

df.apply(cq_processor, axis=1) 
+1

そのコードは機能します。ありがとうございました! 67個の{}セットと各列名への参照を含める必要がないかどうか疑問に思っていましたか?おそらく何とか列番号をループし、データフレーム行の終わりに達するまでコンマとその列の値を追加しますか? –

+0

@AllenH私のソリューションを更新しました。それを確認して試してみてください。 – su79eu7k

0

コードの下にしてみてください。

つまり、rows[1]を呼び出すことは正しくありません。 で、rows['column-name']とする必要があります。

iterrows()従来のリストは返されません。これは整数のジェネレータとSeriesオブジェクトを返します。次のようにsourceからは、関数が定義されています

columns = self.columns 
for k, v in zip(self.index, self.values): 
    s = Series(v, index=columns, name=k) 
    yield k, s 

あなたpandasがわかっている場合は、index=columnsビットはのみ列名として有効なインデックスを受け入れるようにシリーズに伝えていることがわかります。この引数が指定されていない場合、Seriesはデフォルトで整数ベースのインデックス付けを許可します。

tl; dr最初のアプローチを行います。この特定のSeriesオブジェクトでインデックスを作成するのは正しい方法です。代わりに.format()を使用して、実際にそれをもっとPythonicにすることを検討してください。

関連する問題