gpt4 book ai didi

python - 如何预处理 "big data"tsv 文件并将其加载到 python 数据帧中?

转载 作者:行者123 更新时间:2023-11-28 20:17:39 25 4
gpt4 key购买 nike

我目前正在尝试将以下以制表符分隔的大文件导入到 Python 中的类似数据框的结构中——当然我正在使用 pandas 数据框,尽管我对其他选项持开放态度。

此文件有几 GB 大小,不是标准的 tsv 文件——它已损坏,即行的列数不同。一行可能有 25 列,另一行可能有 21 列。

这是一个数据示例:

Col_01: 14 .... Col_20: 25    Col_21: 23432    Col_22: 639142
Col_01: 8 .... Col_20: 25 Col_22: 25134 Col_23: 243344
Col_01: 17 .... Col_21: 75 Col_23: 79876 Col_25: 634534 Col_22: 5 Col_24: 73453
Col_01: 19 .... Col_20: 25 Col_21: 32425 Col_23: 989423
Col_01: 12 .... Col_20: 25 Col_21: 23424 Col_22: 342421 Col_23: 7 Col_24: 13424 Col_25: 67
Col_01: 3 .... Col_20: 95 Col_21: 32121 Col_25: 111231

如您所见,其中一些列的顺序不正确...

现在,我认为将此文件导入数据帧的正确方法是预处理数据,以便您可以输出具有 NaN 值的数据帧,例如

Col_01 .... Col_20    Col_21    Col22    Col23    Col24    Col25
8 .... 25 NaN 25134 243344 NaN NaN
17 .... NaN 75 2 79876 73453 634534
19 .... 25 32425 NaN 989423 NaN NaN
12 .... 25 23424 342421 7 13424 67
3 .... 95 32121 NaN NaN NaN 111231

更复杂的是,这是一个非常大的文件,有几 GB。

通常,我尝试以 block 的形式处理数据,例如

import pandas as pd

for chunk in pd.read_table(FILE_PATH, header=None, sep='\t', chunksize=10**6):
# place chunks into a dataframe or HDF

但是,我看不出有什么办法可以先以 block 的形式“预处理”数据,然后使用 block 将数据读入pandas.read_table()。你会怎么做?有哪些预处理工具可用——也许是 sedawk

这是一个具有挑战性的问题,因为数据的大小以及在加载到数据帧之前必须完成的格式化。任何帮助表示赞赏。

最佳答案

$ cat > pandas.awk
BEGIN {
PROCINFO["sorted_in"]="@ind_str_asc" # traversal order for for(i in a)
}
NR==1 { # the header cols is in the beginning of data file
# FORGET THIS: header cols from another file replace NR==1 with NR==FNR and see * below
split($0,a," ") # mkheader a[1]=first_col ...
for(i in a) { # replace with a[first_col]="" ...
a[a[i]]
printf "%6s%s", a[i], OFS # output the header
delete a[i] # remove a[1], a[2], ...
}
# next # FORGET THIS * next here if cols from another file UNTESTED
}
{
gsub(/: /,"=") # replace key-value separator ": " with "="
split($0,b,FS) # split record from ","
for(i in b) {
split(b[i],c,"=") # split key=value to c[1]=key, c[2]=value
b[c[1]]=c[2] # b[key]=value
}
for(i in a) # go thru headers in a[] and printf from b[]
printf "%6s%s", (i in b?b[i]:"NaN"), OFS; print ""
}

数据样本(pandas.txt):

Col_01 Col_20 Col_21 Col_22 Col_23 Col_25
Col_01: 14 Col_20: 25 Col_21: 23432 Col_22: 639142
Col_01: 8 Col_20: 25 Col_22: 25134 Col_23: 243344
Col_01: 17 Col_21: 75 Col_23: 79876 Col_25: 634534 Col_22: 5 Col_24: 73453
Col_01: 19 Col_20: 25 Col_21: 32425 Col_23: 989423
Col_01: 12 Col_20: 25 Col_21: 23424 Col_22: 342421 Col_23: 7 Col_24: 13424 Col_25: 67
Col_01: 3 Col_20: 95 Col_21: 32121 Col_25: 111231

$ awk -f pandas.awk -pandas.txt
Col_01 Col_20 Col_21 Col_22 Col_23 Col_25
14 25 23432 639142 NaN NaN
8 25 NaN 25134 243344 NaN
17 NaN 75 5 79876 634534
19 25 32425 NaN 989423 NaN
12 25 23424 342421 7 67
3 95 32121 NaN NaN 111231

所有需要的列都应该在数据文件头中。在处理时收集 header 可能不是什么大工作,只需将数据保存在数组中并最后打印,可能在版本 3 中。

如果您从与数据文件 (pandas.txt) 不同的文件 (cols.txt) 读取 header ,请执行脚本 (pandas. awk):

$ awk -F pandas.awk cols.txt pandas.txt

关于python - 如何预处理 "big data"tsv 文件并将其加载到 python 数据帧中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39398986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com