如何正确矢量化而不是迭代?

How to properly vectorize instead of iterate?

Whosebug 上有一个非常流行的答案,您不应该迭代 Pandas' 数据帧:

在我的例子中,我想从数据框的两列中获取值,并用它们创建一个 SQL INSERT INTO... 语句列表。像这样:

import pandas as pd

df = pd.DataFrame({'velocity':[12,10,15], 'color':['blue','green','yellow']})

mylist = list()
for index, row in df.iterrows():
    mylist.append('INSERT INTO mytable(velocity, color) VALUES (' + \
                  str(row['velocity']) + \
                  ', "' + \
                  str(row['color']) + \
                  '");' )

[print(x) for x in mylist]
# INSERT INTO mytable(velocity, color) VALUES (12, "blue");
# INSERT INTO mytable(velocity, color) VALUES (10, "green");
# INSERT INTO mytable(velocity, color) VALUES (15, "yellow");

我知道我可以这样写: [mylist.append('INSERT INTO mytable(velocity) VALUES ('+ str(x) + ');') for x in df["velocity"]] 如果我只对一个专栏感兴趣。但这就是“矢量化”的意思吗?以及它如何适用于您需要 pandas' 数据框的每一行中的两个项目的情况?

默认情况下,Pandas/Numpy 对字符串操作进行最小矢量化。你可以做的一件事是避免 append 因为当你有一个长数据帧时它可能会很昂贵:

mylist = ['INSERT INTO mytable(velocity, color) VALUES (' + \
                  str(row['velocity']) + \
                  ', "' + \
                  str(row['color']) + \
                  '");' 
          for index, row in df.iterrows()
        ]

矢量化版本应该是这样的,

queries = (
    'INSERT INTO mytable(velocity, color) VALUES (' +
    df['velocity'].astype(str) +
    ', "' +
    df['color'].astype(str) +
    '");'
)
print(queries.to_list())

输出

['INSERT INTO mytable(velocity, color) VALUES (12, "blue");',
 'INSERT INTO mytable(velocity, color) VALUES (10, "green");',
 'INSERT INTO mytable(velocity, color) VALUES (15, "yellow");']

高效插入数据库table

df[['velocity', 'color']].to_sql(
    name='table_name',
    con=engine,
    schema='online',
    index=False,
    if_exists='append'
)