Преобразование объектов DataFrame в строки или выравнивание кодировки DataFrame - PullRequest
1 голос
/ 06 ноября 2019

Я пытаюсь разбить столбец данных в текстовом фрейме на каждое отдельное слово для анализа. Для начала я могу сделать это с помощью небольшого набора данных из файла CSV. Рабочий код выглядит следующим образом:

data = pd.read_csv('PLUSCA.csv', encoding='utf8')
#print(data)

print(data['DESCRIPTION'])
# Data type is object 

data['words'] = data['DESCRIPTION'].str.strip().str.split('[\W_]+')

# Clean Data 
dataClean = data[['SITEID', 'DESCRIPTION', 'words']].copy()
print(dataClean['words'])

Теперь проблема возникает, когда я пытаюсь получить НАМНОГО больший набор данных через SQL-запрос (у которого нет параметров для encoding='utf-8'. У меня есть следующее:

SQLquery = pd.read_sql_query("""long working query""", conn) 
data = pd.DataFrame(SQLquery)

print(data.head())
print(data['LDTEXT'])

# Create word array 
print(data['LDTEXT'])
#returns correct text 
print(data['LDTEXT'].dtype)
#returns object - same as working code 
data['words'] = data['LDTEXT'].str.strip().str.split('[\W_]+')

Я пробовал несколько разных вещей, включая, но не ограничиваясь:

data['LDTEXT'] = data['LDTEXT'].astype(str)
data['words'] = data['LDTEXT'].apply(str).str.strip().str.split('[\W_]+')
data['words'] = data[u'LDTEXT'].series.str.strip().str.split('[\W_]+')

#doesnt exist but tried
data = pd.DataFrame(SQLquery, encodeing'utf-8')

Я получаю одну из следующих ошибок:

UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 172: character maps to <undefined>

SystemError: decoding with 'WINDOWS-1252' codec failed (SystemError: <built-in function charmap_decode> returned a result with an error set)

AttributeError: Can only use .str accessor with string values!

Наряду с некоторыми очевидными, такими как:

TypeError: __init__() got an unexpected keyword argument 'encoding'

Единственное различие между двумя наборами данных состоит в том, что он не работает, много текста намного больше и импортируется из SQL вместо CSV. Также я попробовал несколькоastype('|S') для обработки больших строк. Все еще не повезло. Мне кажется, что это проблема кодирования. Как я могу проверить кодировку данных и изменить ее на импорт SQL? Имеет ли значение размер данных? Обрабатываются ли строки байтов большего размерапо-разному? Рабочий текст набора данных, вероятно, состоит из 1-2 предложений каждое, где большой набор может содержать до пары абзацев на строку.

ИЛИ Как правильно преобразовать это вtring (чего я хотел бы избежать, потому что я знаю, что у меня есть рабочий скрипт с dtype object)?

Что мне здесь не хватает?

Дайте мне знать, если вам нужна дополнительная информация

РЕДАКТИРОВАТЬ

Я добавил следующий тест

for i, row in enumerate(data['LDTEXT']):
    #print("#################### NEW ROW ######################")
    #print(row)
    print(i)
    text = row.read()
    #print(text)
    try:
        print("TESTING %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%")
        text.strip().split('[\W_]+') 
        print(text)
    except UnicodeDecodeError:
        print(text)
        break

Кажется, что Oracle создает объекты cx_Oracle.LOB вместо обычных объектов python.

1 Ответ

1 голос
/ 07 ноября 2019

Я прошел через нечто подобное, где я не мог декодировать свои данные, потому что в моем наборе данных был недопустимый символ. После нахождения строки, где существовал недопустимый символ, я смог удалить его, прежде чем взаимодействовать с данными.

Вы пытались разбить предложения на слова в подмножестве ваших данных?

Например:

data.iloc[0]['LDTEXT'].str.strip().str.split('[\W_]+')

Можете ли вы найти какие-нибудь строки, которые работают? Если да, можете ли вы найти какие-либо строки, которые конкретно не работают? Как выглядят данные в столбце «LDTEXT» для строки, которая не работает?

Вы можете использовать что-то вроде следующего для определения первой проблемной строки в ваших данных:

for (i, row) in data.iterrows():
    try:
       row['LDTEXT'].str.strip().str.split('[\W_]+') 
    except UnicodeDecodeError:
        print(i)
        print(row['LDTEXT'])
        break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...