pandas конвертация нужного типа данных с игнорированием ненужных типов

Есть .xlsx файл.

Первая колонка - нумерация строк (это ещё до считывания в dataframe, я не путаю эти понятия). Первая строка - имена колонок.

Заполнен данными типа hex, int, str либо None (пустые клетки).

Надо:

  1. считать данные
  2. конвертировать hex в int
  3. всё кроме 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
→ Ссылка
Автор решения: strawdog

Можно попробовать так, например:

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
→ Ссылка