Я пытаюсь отформатировать много (> 100) фреймов данных после их чтения при помощи Pandas. Это не большие наборы данных (максимальный размер файла составляет около 50 МБ), но имеют различное количество столбцов (10-100) с различными именами столбцов (некоторые из них одинаковые), которые могут иметь целочисленные значения, значения с плавающей запятой, дату и время или строковые значения. , Конечная цель состоит в том, чтобы объединить их в один фрейм данных, но прежде чем я это сделаю, мне нужно правильно определить формат каждого столбца. Я хочу ускорить этот процесс.
Редактировать: каждый тип данных для столбца возвращается как «объект». Я попытался df.infer_objects (), но он только что возвратил те же типы данных.
Моя текущая функция форматирования
def format_df(df):
'''
Formats the dataframe in the way I want.
Parameters
-----------
df: a pandas.DataFrame - dataframe with unformatted data types
Returns
-----------
df1: a pandas.DataFrame - dataframe with correct data types
'''
start = time.time()
# Copy dataframe to make changes
df1 = df.copy()
# Format the correct data type for each column in the dataframe
for col in df.columns:
try:
# Tries to convert column to datetime format
df1[col] = df[col].map(pd.to_datetime)
# If entire column is null, then convert to NaN instead of NaT
if len(df1[df1[col].isnull() == True]) == len(df1[col]):
df1[col] = df1[col].astype(object).where(df1[col].notnull(),
np.nan)
df1[col] = df1[col].astype(float)
except:
# If it can't convert to datetime, try converting to a numeric
# format (int or float)
try:
df1[col] = df[col].map(pd.to_numeric)
except:
# If data is not datetime or numeric (i.e. string of
# characters), leave as is
df1[col] = df[col]
end = time.time()
print('Time to format dataframe: ', (end-start)/60)
return df1
Запуск функции в наборе данных занимает от 30 секунд до 2 минут, но, поскольку у меня более 100 кадров данных, весь процесс занимает около 30 минут. Как я могу сделать это быстрее?
Я также ищу способ получить типы данных столбца до того, как прочитал файл, но я не уверен, что это будет быстрее.