我正在尝试将数据框文本列拆分为每个单独的单词以进行分析。首先,我可以使用 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 个句子,其中每行最多可以有几个段落。
或者如何将其正确转换为字符串(我想避免这种情况,因为我知道我有一个带有 dtype 对象
的工作脚本)?
我在这里缺少什么?
如果您也需要更多信息,请告诉我
编辑
我添加了以下测试
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 对象。
最佳答案
我经历了类似的事情,我无法解码我的数据,因为我的数据集中有一个无效字符。找到存在无效字符的行后,我能够在与数据交互之前将其删除。
您是否尝试过将数据子集上的句子拆分为单词?
例如:
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
关于python - 将 DataFrame 对象转换为字符串或对齐 DataFrame 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58738364/