[英]Pandas iterate through columns in dataframe for custom MySQL insert string
我試圖將單個數據幀行中不同列的值合並為一個字符串,並以逗號分隔,以便我可以創建一個自定義SQL插入字符串以在MySQL數據庫上執行。 我有67個不同的列,並且我試圖防止編寫分別針對每個列的名稱的代碼,主要是為了最大程度地提高代碼在不同大小的數據幀中的可重用性。 我可能有1到2000行要遍歷,每行都有一個INSERT查詢。
例如,如果我的DataFrame包括以下內容:
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
我想為數據幀中的每一行創建一個字符串:INSERT INTO表名VALUES(20160321、121、3、67.5、43.8)INSERT INTO表名VALUES(20160322、87、5、73.1、53.2)INSERT INTO表名VALUES(20160323 ,90、2、71.1、51.7)插入表名VALUES(20160324、103、7、68.3、47.0)
我已經考慮過使用數據框的to_sql()函數,但是無法使代碼與我的數據庫結構一起使用。
因此,我的目標是遍歷每一行,並在括號中手動創建字符串,並用逗號分隔:
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']))
為了使我的代碼“ pythonic”而不是那么僵化,我嘗試遍歷每一行,並在各列索引之間添加逗號:
for index, row in df.iterrows():
string = ''
for x in range(len(row)):
string += '%s, ' % row[x]
print('INSERT INTO tablename VALUES (%s)' % string)
我通常會在上面的代碼中遇到索引錯誤和超出范圍的錯誤,並且我不確定如何走正確的路線。 感謝您檢查我的代碼和思考過程,以及有關如何改進代碼的任何建議。 我的目標是盡可能提高效率,最大程度地減少我必須編寫的代碼量(尤其是當有67列時!),但仍然可以使代碼靈活地用於各種用途,尤其是在列數不斷變化的情況下。
謝謝!
請嘗試以下代碼
def cq_processor(x):
return 'INSERT INTO tablename VALUES ({})'.format(', '.join(x.tolist()))
df.apply(cq_processor, axis=1)
由於rows
不支持數字索引,因此出現錯誤。
換句話說,調用rows[1]
是不正確的。 您必須改為調用rows['column-name']
。
iterrows()
不返回傳統列表-它返回整數和Series
對象的生成器。 從源頭開始 ,該函數的定義如下:
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 .format()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.