[英]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.