#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
динамически, я могу представить себе довольно простую функцию-оболочку, которая выполняет обе задачи с использованием этого подхода.