如何正确矢量化而不是迭代?
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'
)
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'
)