Python 在pandas中格式化非结构化csv

Python 在pandas中格式化非结构化csv,python,python-3.x,pandas,csv,Python,Python 3.x,Pandas,Csv,我在阅读存档的4chan评论中的准确信息时遇到了一个问题。由于4chan线程的线程结构(似乎)不能很好地转换为矩形数据帧,因此我在将每个线程的适当注释转换为pandas中的一行时遇到了问题 为了加剧这个问题,数据集的大小是54GB,我问了一个类似的问题,即如何将数据读入pandas数据帧(在该数据帧中,问题的解决方案使我意识到了这个问题),这使得诊断每个问题都变得单调乏味 我用于读取部分数据的代码如下: def Four_pleb_chunker(): """ :return:

我在阅读存档的4chan评论中的准确信息时遇到了一个问题。由于4chan线程的线程结构(似乎)不能很好地转换为矩形数据帧,因此我在将每个线程的适当注释转换为pandas中的一行时遇到了问题

为了加剧这个问题,数据集的大小是54GB,我问了一个类似的问题,即如何将数据读入pandas数据帧(在该数据帧中,问题的解决方案使我意识到了这个问题),这使得诊断每个问题都变得单调乏味

我用于读取部分数据的代码如下:

def Four_pleb_chunker():
    """
    :return: 4pleb data is over 54 GB so this chunks it into something manageable
    """
    with open('pol.csv') as f:
        with open('pol_part.csv', 'w') as g:
            for i in range(1000):   ready
                g.write(f.readline())

    name_cols = ['num', 'subnum', 'thread_num', 'op', 'timestamp', 'timestamp_expired', 'preview_orig', 'preview_w', 'preview_h',
            'media_filename', 'media_w', 'media_h', 'media_size', 'media_hash', 'media_orig', 'spoiler', 'deleted', 'capcode',
            'email', 'name', 'trip', 'title', 'comment', 'sticky', 'locked', 'poster_hash', 'poster_country', 'exif']

    cols = ['num','timestamp', 'email', 'name', 'title', 'comment', 'poster_country']

    df_chunk = pd.read_csv('pol_part.csv',
                           names=name_cols,
                           delimiter=None,
                           usecols=cols,
                           skip_blank_lines=True,
                           engine='python',
                           error_bad_lines=False)

    df_chunk = df_chunk.rename(columns={"comment": "Comments"})
    df_chunk = df_chunk.dropna(subset=['Comments'])
    df_chunk['Comments'] = df_chunk['Comments'].str.replace('[^0-9a-zA-Z]+', ' ')

    df_chunk.to_csv('pol_part_df.csv')

    return df_chunk
这段代码运行良好,但是由于每个线程的结构,我编写的解析器有时会返回无意义的结果。在csv格式中,这是数据集的前几行的样子(请原谅屏幕截图,使用此UI实际写出所有这些行非常困难。)

正如可以看到的那样,每个线程的注释都被“\”分割,但是每个注释都没有自己的行。我的目标是至少将每个注释放入自己的行中,以便正确解析。然而,我用来解析数据的函数在1000次迭代后被切断,不管它是否是新行

从根本上说,我的问题是:我如何构造这些数据,以便真正准确地读取注释,并且能够在完整的示例数据框中读取注释,而不是在截断的示例数据框中读取注释。至于我尝试过的解决方案:

df_chunk = pd.read_csv('pol_part.csv',
                               names=name_cols,
                               delimiter='',
                               usecols=cols,
                               skip_blank_lines=True,
                               engine='python',
                               error_bad_lines=False)
如果删除/更改参数
分隔符
,则会出现以下错误:

Skipping line 31473: ',' expected after '"'
这是有意义的,因为数据不是由
分隔的,
因此它跳过了不符合该条件的每一行,在本例中是整个数据帧。在参数中输入
\
会导致语法错误。我有点不知所措,不知道下一步该怎么办,所以如果有人有处理类似问题的经验,你就是救命恩人。让我知道,如果有什么我已经包括在这里,我会更新后

更新,以下是CSV中用于测试的一些示例行:

2   23594708    1385716767  \N  Anonymous   \N  Example: not identifying the fundamental scarcity of resources which underlies the entire global power structure, or the huge, documented suppression of any threats to that via National Security Orders. Or that EVERY left/right ideology would be horrible in comparison to ANY in which energy scarcity and the hierarchical power structures dependent upon it had been addressed.
3   23594754    1385716903  \N  Anonymous   \N  ">>23594701\
                                                 \
                                                  No, /pol/ is bait. That's the point."
4   23594773    1385716983  \N  Anonymous   \N  ">>23594754
                                                 \
                                                 Being a non-bait among baits is equal to being a bait among non-baits."
5   23594795    1385717052  \N  Anonymous   \N  Don't forget how heavily censored this board is! And nobody has any issues with that.
6   23594812    1385717101  \N  Anonymous   \N  ">>23594773\
                                                 \
                                                 Clever. The effect is similar. But there are minds on /pol/ who don't WANT to be bait, at least."

下面是一个示例脚本,用于将csv转换为每条注释的单独行:

import csv

# open file for output and create csv writer
f_out = open('out.csv', 'w')
w = csv.writer(f_out)

# open input file and create reader
with open('test.csv') as f:
    r = csv.reader(f, delimiter='\t')
    for l in r:
        # skip empty lines
        if not l:
            continue
        # in this line I want to split the last part 
        # and loop over each resulting string
        for s in l[-1].split('\\\n'):
            # we copy all fields except the last one
            output = l[:-1]
            # add a single comment
            output.append(s)
            w.writerow(output)

就我个人而言,我会使用内置的python csv包编写一个不同的纯python脚本,将整个数据集转换为对您有意义的csv格式。这并不需要很快,因为您只需要运行一次。在那之后,pandas read_csv应该不会有任何问题。@rje我想这样做,但是,我甚至不知道如何才能将每条评论作为一行阅读,特别是因为每个注释的分隔符
“\'
在python语法中是一个新行。你能从csv中包含一些行吗?这样我就可以看到我们在谈论什么了?@rje刚刚添加了一些内容。你能告诉我解决方案是否有效吗?我很好奇;)现在测试它,现在我得到了
索引器:列表索引超出范围。。从网站复制/粘贴csv肯定会带来问题。我添加了一个分隔符,因为我认为您的文件是以制表符分隔的。。现在能用了吗?如果没有,你能下载一小部分实际的csv吗?现在测试,到目前为止我遇到了任何问题,这需要一秒钟。另外,现在添加了一些代码来跳过空行-这导致了你的问题。最后一句话:将倒数第二行改为
output.append(s.strip())
这甚至会去除注释周围多余的空白;)