【问题标题】:Converting DataFrame Objects to strings or Aligning DataFrame Encoding将 DataFrame 对象转换为字符串或对齐 DataFrame 编码
【发布时间】:2019-11-06 20:57:50
【问题描述】:

我正在尝试将数据框的文本列拆分为每个单独的单词以进行分析。对于初学者,我可以使用 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 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 对象。

【问题讨论】:

    标签: python python-3.x pandas dataframe text


    【解决方案1】:

    我经历了类似的事情,我无法解码我的数据,因为我的数据集中有一个无效字符。在找到存在无效字符的行后,我能够在与数据交互之前将其删除。

    您是否尝试在数据子集上将句子拆分为单词?

    例如:

    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
    

    【讨论】:

    • 我确信大多数行都可以正常工作,因为它需要一段时间才能返回错误。我无法到达尚未工作的“第一”行。
    • 这似乎进一步支持了我的理论,即您的数据中有一个不受支持的字符。我将更新我的答案,以提供一个示例,说明如何识别存在问题的第一行。
    • 嗯,我得到了ValueError: too many values to unpack (expected 2),我在循环中添加了data.iterrows()。
    • 嗯,我得到了ValueError: too many values to unpack (expected 2),我在循环中添加了data.items()。现在从行 ['LDTEXT"] 我得到一个关键错误
    • 查看编辑 - 测试作品。似乎它停在 213000ish 的第 163243 行。我应该可以手动消除
    猜你喜欢
    • 2021-06-24
    • 2018-09-03
    • 1970-01-01
    • 2013-11-13
    • 2015-09-15
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    相关资源
    最近更新 更多