如果这是重复的道歉;我看了,在网上找不到这个问题(好)。
假设我有一个带有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"]
["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
答案 0 :(得分:0)
受this SO thread的启发,我建议将所有名称连接成一个大字符串,然后将此字符串插入单个SQL查询(而不是每行单独查询)以获取映射每个字符串的DataFrame名称为其ID。
尝试这样的事情(现在不能测试,对不起!):
# 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)