Переименование всех столбцов во фрейме данных pandas вызывает проблемы с to_sql
Я собрал около 100 фреймов данных панд из проекта очистки селена и могу успешно перебрать все файлы.pickle в папке на моей Raspberry и вставить их в MariaDB.
Проблема в том, что я допустил ошибку с именами столбцов в указанных фреймах данных, и я хотел бы очистить их, переименовав сразу все имена столбцов внутри цикла for. Я нашел очень привлекательное решение на /questions/43840282/pereimenovanie-stolbtsov-v-pandah/43840340#43840340 которое "работает", используя set_axis и список имен столбцов, на которые я хочу изменить. Однако, если я сделаю это, имена столбцов верны, но они имеют следующий формат:
('Имя_столбец',)
вместо
column_name
Это то, как я хочу их в моей базе данных MariaDB, конечно.
дела
print(df.head())
все выглядит нормально, хотя в оболочке python проблема возникает только с to_sql и именем столбца в базе данных.
Кто-нибудь может мне помочь? Пожалуйста, не будьте слишком резкими в моем коде. Я программировал Python только пару недель. Общие советы о том, как правильно структурировать этот код, чтобы сделать его быстрее, также очень ценятся:) Или комментарии о том, как поместить очищенные данные в базы данных sql в целом (я новичок в большинстве этих вещей)
Ниже приведен полный код, который компилируется и работает. Наиболее актуальная строка это:
added_df = current_df.set_axis([columns_new], axis='columns', inplace=False)
from sqlalchemy import create_engine
import pandas as pd
import glob
path = '/YOUR PATH'
main_path = 'YOUR PATH'
# Create sqlalchemy engine to connect to local server
engine = create_engine('mysql+pymysql://pi:YOUR_PASSWORD@localhost/YOURDB')
for filename in glob.iglob(path+'*.pickle'): #loops through every file in a folder
#Clean out the unwanted parts of the file names (table names in DB)
current_company = filename.replace(path, '')
current_company_sql = current_company.translate( { ord(c):None for c in ' \n\t\r' } )
current_company_sql = current_company_sql.lower()
current_company_sql = current_company_sql.replace('ä', 'a')
current_company_sql = current_company_sql.replace('ö', 'o')
current_company_sql = current_company_sql.replace('(lp)', '')
current_company_sql = current_company_sql.replace('(t)', '')
current_df = pd.read_pickle(filename)
#Clean out the unwanted parts of the column names
columns_new = [] #a list of the new names i want as DB column names
for column in current_df: #loops through every column in every dataframe
column_edit = column.lower()
column_edit = column_edit.translate( { ord(c):None for c in ' \n\t\r' } )
column_edit = column_edit.replace('(p)', '_p_')
column_edit = column_edit.replace('(b)', '_b_')
column_edit = column_edit.replace('(e)', '_e_')
column_edit = column_edit.replace('(ev)', '_ev_')
column_edit = column_edit.replace('(cps)', '_cps_')
column_edit = column_edit.replace('(eps)', '_eps_')
columns_new.append(column_edit)
added_df = current_df.columns(columns_new)
added_df = current_df.set_axis([columns_new], axis='columns', inplace=False)
print(added_df.head())
#Transfer to database
print('Table name of inserted data is: '+current_company_sql.replace('.pickle', ''))
added_df.to_sql(current_company_sql.replace('.pickle', ''), engine)