大量数据,尝试替换一列中的分隔符但不是所有分隔符

Posted

技术标签:

【中文标题】大量数据,尝试替换一列中的分隔符但不是所有分隔符【英文标题】:Large chunk of data, trying to replace delimiter character in one column but not all delimiter characters 【发布时间】:2016-08-01 14:04:03 【问题描述】:

我正在尝试使用 Pandas 分析一个数据集(200mb,~3mil 行),但该数据集包含由随机用户填充的一列,其中允许所有字符。这产生了分隔符 (\t) 也经常出现在最后一列中的问题。在 GVIM 中,我尝试搜索并用 ':' 替换所有 '\t',但这也替换了实际的分隔符(在 GVIM 中未显示)。有没有人有关于如何专门替换大型数据集中某一列中的字符的提示?

例如我拥有的文件使用制表符 (\t) 作为其列的分隔符。但是,有一行包含以下信息:

137179101   genericname 431 499 19568   0   26 Apr 2010 01:45:05 GMT    Oakland,\   CA

这弄乱了我的 Pandas 笔记本,因为它需要 8 个字段,但由于 \ 和 CA 之间的制表符而得到 9 个字段。第 8 列是唯一可以填写您自己的选项卡的地方。那么如何仅更改第八列中的“\t”?

提前致谢!

请注意,我对 Python 脚本编写的经验为零,我认为可以解决它,但是比学习 Python 更快的方法会很好。

【问题讨论】:

嗯,我认为您需要将csv 的一行中delimiters 的数量预处理为新的csv,然后使用read_csv 我该怎么做?我在 Pandas 中找不到它的任何功能 【参考方案1】:

我认为您可以先通过read_csvsep='₩' 创建DataFrame,然后使用带有参数n=7str.split,因为您只需要通过第一个7 分隔符进行分割:

import pandas as pd
import io

temp=u"""137179101   genericname 431 499 19568   0   26 Apr 2010 01:45:05 GMT    Oakland,\   CA
137179101   genericname 431 499 19568   0   26 Apr 2010 01:45:05 GMT    Oakland,\   CA
137179101   genericname 431 499 19568   0   26 Apr 2010 01:45:05 GMT    Oakland,\   CA"""
#after testing replace io.StringIO(temp) to Location
df  = pd.read_csv(io.StringIO(temp), sep="₩", header=None, names=['data'], encoding='Latin-1')

with pd.option_context('display.max_colwidth', -1):
    print df 
                                                                                     data
0  137179101   genericname 431 499 19568   0   26 Apr 2010 01:45:05 GMT    Oakland,\   CA
1  137179101   genericname 431 499 19568   0   26 Apr 2010 01:45:05 GMT    Oakland,\   CA
2  137179101   genericname 431 499 19568   0   26 Apr 2010 01:45:05 GMT    Oakland,\   CA   

print df.data.str.split('\t',n=7).apply(pd.Series)
           0            1    2    3      4  5                         6  \
0  137179101  genericname  431  499  19568  0  26 Apr 2010 01:45:05 GMT   
1  137179101  genericname  431  499  19568  0  26 Apr 2010 01:45:05 GMT   
2  137179101  genericname  431  499  19568  0  26 Apr 2010 01:45:05 GMT   
3  137179101  genericname  431  499  19568  0  26 Apr 2010 01:45:05 GMT   

               7  
0    Oakland,\CA  
1    Oakland,\CA  
2  Oakland,\\tCA  
3        Oakland  

【讨论】:

嘿伙计,我正在尝试使用您的解决方案,但我不确定如何正确使用该命令。我正在通过df = pd.read_csv(Location, header=None, sep='\t', encoding='Latin-1', nrows=1000) 导入我的文件,但我不确定如何将它与您给定的解决方案结合起来。如果这是一个非常简单的命令,我很抱歉,但我对这一切都很陌生。 嗯,我认为你不能使用read_csv,因为输出将更多为 8 列 - 一些分隔符可以在最后 8. 列中。所以我认为您将所有 8 列读为一列 - df = pd.read_csv(Location, header=None, sep='~', encoding='Latin-1', nrows=1000) 然后将这一列拆分为所需的 8 列。 但是你可以读取_csv?没有CParserError: Error tokenizing data. 不,我不能(我收到 CParserError),所以我需要在通过 csv_read 之前转换表格,但除此之外我不知道如何导入表格.给定 Location 变量,我应该如何使用您的命令? print df.data.str.split('\t',n=7).apply(pd.Location)? 是的,有没有像 |~° 这样的字符,它不在 csv 中?如果是,您可以将其用作分隔符并将 csv 读取到一大列 - 我认为 df = pd.read_csv(Location, header=None, sep='~', encoding='Latin-1', nrows=1000)。然后你就可以使用我的解决方案了。

以上是关于大量数据,尝试替换一列中的分隔符但不是所有分隔符的主要内容,如果未能解决你的问题,请参考以下文章

SQL 怎么将一列中的数据按一个分隔符分成多列显示

将一列中的字符串拆分为表维护 ID 的多个分隔符

Oracle如何取出某一列的所有不重复值作为单独一列

在数据网格列中添加点分隔符而不是逗号

在SQL过程中将一列中的逗号分隔值拆分为多列

如何用另一个表中的匹配值替换/更新列中每个字符串的所有实例?