如果这是重复的,我们深表歉意;我在网上找不到这个问题的答案(很好)。
假设我有一个带有 name
列的 pandas 数据框。我想查询数据库并获取与每个名称关联的 id,并将该值存储在数据框中。
在本例中,我正在读取 CSV 文件(带有 name
),并查询 MySQL 数据库以获取 id
。我进行了一些数据清理,然后将数据帧上传到 MySQL 数据库(与我查询以获取 id
的表不同的表)。
执行此操作的最佳方法是什么?这是我想到的:
df["id"] = pd.Series(
[pd.read_sql_query(
f"SELECT id FROM table WHERE name LIKE '{name}'",
connection)["id"][0] for name in df["name"]]
)
据我了解,这可以避免在迭代时修改 df
。
- 我们迭代
df["name"]
中的值 - SQL 查询返回一个 DataFrame
["id"][0]
从以下内容中提取感兴趣的值 (id
) DataFrame 并将其存储在列表中- 此值列表将转换为
pd.Series
- 此
pd.Series
已添加到原始df
这可行,但它并没有真正强制 name
和 id
之间建立关联,(我认为)这会更强大。 (而且,显然,上面的代码片段中没有错误处理。)
我尝试了 apply
或 map
或 iterrows
或 iteritems
的组合,但这不起作用,所以出色地。例如:
for index, name in df["name"].iteritems():
id_df = pd.read_sql_query(f"SELECT id FROM tableWHERE name LIKE '{name}'", connection)
temp_df[temp_df["name"] == name]["id"] = id_df["id"][0]
警告:
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
最佳答案
灵感来自this SO thread ,我建议将所有名称连接成一个巨大的字符串,然后将该字符串插入到单个 SQL 查询中(而不是每行单独的查询)以获得将每个名称映射到其 ID 的 DataFrame。
尝试这样的事情(现在无法测试,抱歉!):
# Build a string of comma-separated, quoted names:
# https://stackoverflow.com/q/12007686
names = '"{0}"'.format('", "'.join(df['name']))
# Get a DataFrame of names and IDs
temp = pd.read_sql_query(f"SELECT name, id FROM table WHERE name IN ({names})",
connection)
# Build a pandas Series that maps each name to its ID
# Could also use a python dict. Also, ".values" may not be needed here
name2id = pd.Series(index=temp['name'].values,
data=temp['id'].values)
# Create the ID column in your DataFrame. There are other ways (join, etc.)
df['id'] = df['name'].map(name2id)
关于python - 将 MySQL 结果插入现有的 pandas 数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50109297/