Как быстро изменить формат более 100 кадров данных, если я изначально не знаю dtypes? - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь отформатировать много (> 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 минут. Как я могу сделать это быстрее?

Я также ищу способ получить типы данных столбца до того, как прочитал файл, но я не уверен, что это будет быстрее.

1 Ответ

0 голосов
/ 11 января 2019

Вы можете попробовать мягкое преобразование, используя

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.infer_objects.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...