将MySQL结果插入现有的pandas数据帧

时间:2018-04-30 23:01:17

标签: python mysql pandas

如果这是重复的道歉;我看了,在网上找不到这个问题(好)。

假设我有一个带有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

这有效,但它并没有真正强制nameid之间的关联,我认为这种关联会更强大。 (显然,上面的代码片段中没有错误处理。)

我尝试了applymapiterrowsiteritems的组合,但效果不佳。例如:

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

1 个答案:

答案 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)