大块数据,试图替换一列中的分隔符但不是所有分隔符
Large chunk of data, trying to replace delimiter character in one column but not all delimiter characters
我正在尝试使用 Pandas 分析一个数据集(200mb,约 300 万行),但该数据集包含一个由随机用户填充的列,其中允许所有字符。这会产生一个问题,即分隔符 (\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 更快的方法会更好。
我认为您可以先通过 read_csv
with sep='₩'
and then use str.split
和参数 n=7
创建 DataFrame,因为您只需要按第一个 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
我正在尝试使用 Pandas 分析一个数据集(200mb,约 300 万行),但该数据集包含一个由随机用户填充的列,其中允许所有字符。这会产生一个问题,即分隔符 (\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 更快的方法会更好。
我认为您可以先通过 read_csv
with sep='₩'
and then use str.split
和参数 n=7
创建 DataFrame,因为您只需要按第一个 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