Сохранение dtype фрейма данных Pandas при запуске astype

#python #pandas

#python #pandas

Вопрос:

Есть ли способ сохранить dtypes фрейма данных во время выполнения astype ? У меня есть фрейм данных, который содержит множество пустых списков в различных полях, и поэтому я использую следующее, чтобы преобразовать каждый отдельный столбец в строку, а затем заменить списки:

 data_normalized = data_normalized.astype(str).replace('[]', '', re&ex=False)
  

Однако, поскольку при этом каждый отдельный столбец преобразуется в строку, он также преобразует поля float64 и inte&er в строку. Я бы хотел сохранить эти dtypes, потому что запуск infer_objects не работает:

 data_normalized = data_normalized.infer_objects()
  

Если я посмотрю на dtypes data_normalized , они все object . Есть ли способ сохранить необъектные dtypes без явного присвоения имен столбцам?

Комментарии:

1. Вы ищете select_dtype ?

2. Почему у вас вообще есть фрейм данных со списками? Как правило, вы можете избавить себя от массы проблем, если исправите эту часть проблемы, прежде чем применять это исправление bandaid позже.

Ответ №1:

Пустые списки имеют длину 0, и поскольку вы все равно хотите заменить их пустой строкой, нам не нужно беспокоиться об этом.

 df=pd.DataFrame({'a':[[], 1, 2, 3], 'b': [4, 5, 6, 8.6], 
                 'c': ['foo', [], [], 'bar']})

for col in df:
    try:
        df.loc[df[col].str.len().eq(0), col] = ''
    except AttributeError:
        continue

print(df)
#   a    b    c
#0     4.0  foo
#1  1  5.0     
#2  2  6.0     
#3  3  8.6  bar

print(df.dtypes)
#a     object
#b    float64     # Remained Float
#c     object
#dtype: object

df['a'].to_numpy()
#array(['', 1, 2, 3], dtype=object)  # individual values remain `Int`
  

Ответ №2:

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

 data_normalized.apply(lambda y: ['' if x=='[]' else x for x in y])
  

Хотя типом данных столбцов будет Object, но при доступе к отдельным значениям он будет таким же, как исходный.