pandas конвертация нужного типа данных с игнорированием ненужных типов
Есть .xlsx файл.
Первая колонка - нумерация строк (это ещё до считывания в dataframe, я не путаю эти понятия). Первая строка - имена колонок.
Заполнен данными типа hex, int, str либо None (пустые клетки).
Надо:
- считать данные
- конвертировать
hexвint - всё кроме
hexигнорируем (ставим пустую клетку, например)
Пока что делаю так:
df = pd.read_excel(file, sheet_name='first_sheet')
df1 = df.iloc[1:28,1:11].map(lambda x : int(x, 16)) # вручную выбрал блок данных, без первой строки и первой колонки
print(df1)
Сейчас облегчает задачу, то что нужные мне hex данные стоят кУчно, но скоро таких файлов будут тысячи, и посмотреть на каждый лист каждого файла будет нереально. Конвертация hex в int это несложно, но для автоматической обработки многочисленных пустых клеток и ненужных string надо написать лямбду побольше. И вот тут я немного потерялся.
Ответы (2 шт):
Без образца данных сложно понять картинку.
По префиксу '0x' делаем булев массив (маску) и инвертируем: где ненужные данные, будет True. Меняем все эти ячейки на None. Преобразуем все данные в int по основанию 16 с помощью .map() или .applymap(), указав опциональный аргумент na_action='ignore', чтобы не обрабатывать NaN (таким образом, производительность будет выше и не возникнет ошибок преобразования).
df = pd.DataFrame({'Col1': [7898, '123', None, 'aaa', '0x80'], 'Col2': [10, None, 'bbb', '0x123', 0]})
df[~df.apply(lambda x: x.str.startswith('0x', na=False))] = None
df = df.map(int, base=16, na_action='ignore') # до версии Pandas 2.1.0 используйте .applymap()
print(df)
Col1 Col2
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 NaN 291.0
4 128.0 NaN
Можно попробовать так, например:
def cnv(val):
try:
res = eval(val)
return res
except:
return np.nan
res = df.map(cnv)
на примере данных от @Алексей Р получим:
Col1 Col2
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 NaN 291.0
4 128.0 NaN