Назначьте несколько столбцов фрейма данных в соответствии с таблицей SQL

#python #sql #pandas #dictionary

Вопрос:

У меня есть несколько фреймов данных, которые нужно перевести в таблицы SQL. Все таблицы SQL имеют одну общую схему, а фреймы данных-нет. Мне нужно иметь возможность легко сопоставлять/изменять столбцы df в таблице sql. Все, что я видел здесь, — это манипулирование 1 или 2 полями с помощью df.to_sql. Мне нужно уметь манипулировать по крайней мере 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, я могу легко передавать их с помощью функции 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 для применения при передаче фреймов данных в SQL? Или есть лучший способ?

Ответ №1:

pandas.DataFrame.rename() Метод будет принимать похожий на дикт набор имен столбцов и имен для их переименования. Во многих случаях самым быстрым решением проблемы, которую вы описываете (если я правильно вас понимаю), является использование комбинации 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 динамически, я могу представить себе довольно простую функцию-оболочку, которая выполняет обе задачи с использованием этого подхода.