от
Привет, я хочу безопасно уменьшить размеры данных на фрейме данных как можно меньше и быстрее. Фрейм данных может иметь любые комбинации смешанных dtypes в столбце, в основном это строковые столбцы с np.nan или строкой 'NaN's. Целочисленные столбцы с nans преобразуются в панды. 24.2 Тип данных 'Int8', 'Int16' ... Кажется, что пустые списки и пустые словари приводят к сбоям при преобразовании и понижении, поскольку они преобразуются в числа с плавающей точкой (почему ??), поэтому я исключил их. Мой метод работает, но я не могу поверить, что нет другого простого способа сделать это, тем более нет более быстрого решения. Я долго об этом думаю, и мне нужен быстрый метод, потому что я работаю с кадрами данных, которые могут иметь размер 1000000x150 ячеек. Мой метод:
def convertAndDowncast(column,downcast=True):
    try:
        column = pd.to_numeric(column, downcast='float',errors='ignore')
        if downcast==True:
            column = pd.to_numeric(column, downcast='integer',errors='ignore')
            if column.dtype == 'int8':
                column = column.astype('Int8',casting='safe')
            elif column.dtype == 'int16':
                column = column.astype('Int16',casting='safe')
            elif column.dtype == 'int32' or column.dtype == 'int64':
                column = column.astype('Int32',casting='safe')
    except Exception as e:
        print(e)
        return column
    finally:
        return column


def dtypeCorrection(df,downcast=True):
    if isinstance(df,pd.DataFrame): 
        maskOfNans = df.isnull().values
        array = df.values
        excludedColumns = set(df.columns[(df.applymap(type) == list).any(0)]) | set(df.columns[(df.applymap(type) == dict).any(0)])
        maskOfStringNans = ((((array=='nan')|(array == 'NaN'))|(array =='NaT'))|(array == 'None'))
        combinedMasks = maskOfNans|maskOfStringNans
        array[combinedMasks] = 0
        df[df.columns] = array
        for column in df[set(df)

Тестовое задание:

df = pd.DataFrame.from_dict({0:{'integerColumn':1,'strColumn':'test0','floatColumn':0.1,'strIntegerColumn':'0','strFloatColumn':'0.1',
                                'strObjectColumn':'[1,2,3]','objectColumn':[1,2,3],'strIntegerColumn2':'1','strFloatColumn2':'0.2',
                                'testColumn':{},'testColumn2':[],'testColumn3':[1,2,3]},
                            1:{'integerColumn':np.nan,'strColumn':'test1','floatColumn':np.nan,'strIntegerColumn':'NaN','strFloatColumn':'nan',
                               'strObjectColumn':'NaN','objectColumn':np.nan,'strIntegerColumn2':np.nan,'strFloatColumn2':np.nan,
                               'testColumn':{},'testColumn2':[],'testColumn3':[1,2,3]}},orient='index')

dtypeCorrection(df,downcast=True)
Вывод dtypes:
testColumn3           object
integerColumn           Int8
strObjectColumn       object
strFloatColumn2      float32
strIntegerColumn        Int8
strIntegerColumn2       Int8
testColumn2           object
testColumn            object
strFloatColumn       float32
objectColumn          object
floatColumn          float32
strColumn             object
             

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.
...