大量数据,尝试替换一列中的分隔符但不是所有分隔符
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_csv
和sep='₩'
创建DataFrame,然后使用带有参数n=7
的str.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)
。然后你就可以使用我的解决方案了。以上是关于大量数据,尝试替换一列中的分隔符但不是所有分隔符的主要内容,如果未能解决你的问题,请参考以下文章