Странное поведение numpy issubdtype - PullRequest
0 голосов
/ 10 октября 2018

Я перебираю файл, содержащий 3,3 миллиона строк, чтобы проверить тип данных этого столбца и выполнить действие, основываясь на том, содержит ли он целое число или нет.

Хотя это значение ячейки, такое как a55950602, a92300416 легко распознается как False для issubdtype как np.integer, в случае ga99266e происходит сбой.

Код: import pandas как pd import numpy как np importматематический импорт времени

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 (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))

Код работает хорошо для вышеупомянутых значений, но один, который выдает ошибку на консоли, как показано ниже: Ошибка типа: тип данных "ga99266e" не понятен

1 Ответ

0 голосов
/ 10 октября 2018

Строка 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' необработанные данные (пусто)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...