Строка pd.to_numeric,errors='ignore'
возвращает либо числовое значение, либо ввод .Таким образом, в случае «ga99266e» он возвращает «ga99266e», который является строкой.Если вы передаете numpys issubdtype строку, она проверяет, является ли строка именем dtype .(Например, np.issubdtype ('int', int) возвращает True).
Поэтому вам нужно сначала проверить, является ли ваше поле все еще строкой, а затем, если нет, вы можете проверить, является ли оно целым числом numpy.
Попробуйте:
import pandas as pd
import numpy as np
import time
import math
start_time = time.time()
lstNumberCounts = []
lstIllFormed = []
dfClicks = pd.read_csv('Oct3_distinct_Members.csv')
dfClicks['UNIV_MBR_ID'] = dfClicks['UNIV_MBR_ID'].str.split('-').str[0]
dfClicks['UNIV_MBR_ID'] = dfClicks['UNIV_MBR_ID'].apply(pd.to_numeric,errors='ignore')
for item in dfClicks['UNIV_MBR_ID']:
if not (isinstance(item,str)):
if (np.issubdtype(item,np.integer)):
lstNumberCounts.append(math.floor(math.log10(item))+1)
else:
lstIllFormed.append(item)
print("---Processing Time: %s seconds ---" % (time.time() - start_time))
«a123456» или любая строка, начинающаяся с «a», работает с np.issubdtype
, потому что numpy интерпретирует его как код, сообщающий, какой тип числаследующий номер См .:
Строки типа протокола массива (см. Интерфейс массива)
Первый символ указывает тип данных, а оставшиеся символы указывают числобайт на элемент, кроме Unicode, где он интерпретируется как количество символов.Размер элемента должен соответствовать существующему типу, иначе возникнет ошибка.Поддерживаемые виды:
'?'логическое
байт (со знаком)
байт без знака * B
целое число со знаком i
целое число без знака
'f' с плавающей точкой
'c' комплексная с плавающей точкой
'm' timedelta
'M' datetime
'O' (Python) объекты
'S', 'a' байты с нулевым символом в конце (не рекомендуется)
'U' Строка Unicode
'V' необработанные данные (пусто)