【问题标题】:Assign several DataFrame columns to match SQL table分配多个 DataFrame 列以匹配 SQL 表
【发布时间】:2021-09-08 17:41:13
【问题描述】:

我有几个需要翻转到 SQL 表的 DataFrame。 SQL 表都共享一个模式,但 DataFrame 不共享。我需要能够轻松地将 df 列匹配/更改为 sql 表。我在这里看到的一切都是使用 df.to_sql 操作 1 或 2 个字段。我需要能够像处理列表一样轻松地操作至少 10 个字段。以下是示例表

list1
+-------+-------+-------+-------+  
| name  |hobby1 |hobby2 |hobby3 |  
+-------+-------+-------+-------+   
| kris  | ball  | swim  | dance |  
| james | eat   | sing  | sleep |  
| amy   | swim  | eat   | watch |  
+-------+-------+-------+-------+ 

df2
+---------+------------+-----------+-----------+  
| df2name  | df2hobby1 | df2hobby2 |df2hobby3 |  
+---------+------------+-----------+-----------+   
| kris     | ball      | swim      | dance    |  
| james    | eat       | sing      | sleep    |  
| amy      | swim      | eat       | watch    |  
+----------+-----------+-----------+-----------+ 

sql1
+-----------+-----------+-----------+-----------+  
| sql_name  |sql_hobby1 |sql_hobby2 |sql_hobby3 |  
+-----------+-----------+-----------+-----------+   
| kris      | ball      | swim      | dance     |  
| james     | eat       | sing      | sleep     |  
| amy       | swim      | eat       | watch     |  
+----------+-----------+------------+------------+ 

有时我在 python dict 中接收数据,我可以使用 kwargs 函数轻松传输并且效果很好。我的功能如下:

def transfer_dict(**kwargs):
    transfer = {'sqlname':' ',
               'sqlhobby1' : ' ',
               'sqlhobby2' : ' ',
               'sqlhobby3' : ' '
               }
     transfer.update(kwargs)
     return (transfer)

我这样做很容易转移:

new_list.append(transfer_dict(sqlname=name, sqlhobby1=hobby1, sqlhobby2=hobby2, sqlhobby3=hobby3))

我可以使用我相同的 kwargs 传输函数将 DataFrame 传输到 SQL 吗?还是有更好的办法?

【问题讨论】:

    标签: python sql pandas dictionary


    【解决方案1】:

    pandas.DataFrame.rename() 方法将接受一组类似于 dict 的列名和名称来重命名它们。在许多情况下,您所描述的问题的最快解决方案(如果我对您的理解正确的话)是使用rename()drop() 的组合来更改源DataFrame 使其与SQL 目标匹配,然后按照您所描述的那样使用to_sql()(但现在,至关重要的是,所有列名都与它们的预期目标匹配)。例如:

    sql_mappings = {'df2_name':'sql_name', 'df2_hobby1':'sql_hobby1', 'df2_hobby2':'sql_hobby2', 'df2_hobby3':'sql_hobby3'}
    
    sql_columns = [i for i in sql_mappings.values()]
    
    df2 = df2.rename(columns=sql_mappings)
    df2 = df2.drop(columns=[col for col in df2 if col not in sql_columns ])
    

    如果您想设置 sql 表名之类的内容并动态执行 to_sql,我可以想象一个相当简单的包装函数,它使用这种方法完成这两项任务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-14
      相关资源
      最近更新 更多