繁体   English   中英

熊猫遍历数据框的列以获取自定义MySQL插入字符串

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM