Преобразуйте папку CSV-файлов таким же образом, затем выведите несколько фреймов данных с помощью Python.
У меня есть папка csv-файлов, которые мне нужно преобразовать и манипулировать / очистить, выводя фрейм данных, с которым я затем смогу продолжить работу. Я хотел бы, чтобы один файл данных имел уникальное название для каждого файла CSV. Я написал код, чтобы иметь возможность манипулировать только одним из файлов csv так, как мне хотелось бы, с чистым фреймом данных в конце, но я запутался при попытке перебрать папку и преобразовать все CSV-файлы, заканчивающиеся на датафрейм для CSV.
Вот код, с которым я работал:
import pandas as pd
import numpy as np
import os
from os import listdir
import glob
import win32com.client
filepath = 'C:/Users/me/BMI'
xl = win32com.client.gencache.EnsureDispatch('Excel.Application')
for f in glob.glob(filepath+'/*.xls'):
fullname = os.path.abspath(f)
xl.Workbooks.Open(fullname)
xl.ActiveWorkbook.SaveAs(Filename=fullname.replace('.xls','.csv'),
FileFormat=win32com.client.constants.xlCSVMSDOS,
CreateBackup=False)
xl.ActiveWorkbook.Close(SaveChanges=False)
os.listdir('C:/Users/me/BMI')
def find_csv_filenames( path_to_dir, suffix=".csv" ):
filenames = listdir(path_to_dir)
return [ filename for filename in filenames if filename.endswith( suffix ) ]
filenames = list(find_csv_filenames(filepath))
for i in filenaames:
df = pd.read_csv(filepath+'/'+i)
del df['Unnamed: 0']
# Extract by rows - create list of rows that are blank
nul_rows = list(df[df.isnull().all(axis=1)].index)
list_of_dataframes = []
list_of_dataframes.append(df.iloc[:nul_rows[0] - 1,:])
for i in range(len(nul_rows) - 1):
list_of_dataframes.append(df.iloc[nul_rows[i]+1:nul_rows[i],:])
list_of_dataframes.append(df.iloc[nul_rows[4] - 1::])
# Remove null columns
cleaned_tables = []
for _df in list_of_dataframes:
cleaned_tables.append(_df.dropna(axis=1, how='all'))
# cleaned_tables is a list of the dataframes
print(cleaned_tables[0])
# drop second row of data frame (subtitle)
df = df.drop(df.index[0])
#set up headers in row 1
df=df.set_value(1, df.columns[0], 'brands')
# change column names to proper headers (brand as first column, years of data following)
for i in list(range(len(df.columns))):
df = df.rename(columns={df.columns[i]: df.iloc[0][df.columns[i]]})
#get rid of double headers (row 1)
df = df.drop(df.index[0])
1 ответ
Если у вас есть код, который преобразует один файл.csv, и вы хотите выполнить одинаковые действия для всех файлов.csv в каталоге и получить уникальный DataFrame для каждого файла.csv, можете ли вы сделать что-то подобное?
import pandas as pd
import numpy as np
import os
filepath = r'C:\Users\me\BMI'
df_list = []
for file in os.listdir():
if file.endswith('.csv'):
temp_df = pd.read_csv(os.path.join(filepath, file), encoding='utf-8')
# transformation and clean-up steps here...
# ...
df_list.append(temp_df)
каждый temp_df
будет храниться в df_list
,
Вы можете объединить их в один последний DataFrame в конце, например:
one_df = pd.concat(df_list, ignore_index=True)
Если у вас возникли проблемы с чтением файла в информационный кадр, попробуйте определить разделитель sep
(если ваши данные не разделены запятыми) и encoding
если ваши CSV-файлы закодированы в определенной кодировке. Пример:
pd.read_csv(..., sep='\t', encoding='cp1252')