#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, но при доступе к отдельным значениям он будет таким же, как исходный.