Я пытаюсь разбить столбец данных в текстовом фрейме на каждое отдельное слово для анализа. Для начала я могу сделать это с помощью небольшого набора данных из файла 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.