Pandas直接讀取arff格式的文件,這種需求還是頭一次碰到!

常規(guī)arff文件讀取
之前有位群友遇到了arff格式的數(shù)據(jù),卻不知道怎么讀?。?br>



編碼是utf-8 列名都在以@attribute開(kāi)頭的行 數(shù)據(jù)在@data的后面的部分 理解了這三點(diǎn),我馬上就能用pandas直接讀取它,下面看看代碼:
import pandas as pd
with open("adult_census_19210979.arff", encoding="utf-8") as f:
header = []
for line in f:
if line.startswith("@attribute"):
header.append(line.split()[1])
elif line.startswith("@data"):
break
df = pd.read_csv(f, header=None)
df.columns = header
df
結(jié)果如下:
為了后續(xù)使用方便,我們可以將上面的代碼封裝成函數(shù):def read_arrf(file):
with open(file, encoding="utf-8") as f:
header = []
for line in f:
if line.startswith("@attribute"):
header.append(line.split()[1])
elif line.startswith("@data"):
break
df = pd.read_csv(f, header=None)
df.columns = header
return df
這樣,讀取任何arrf文件都方便,只需要直接傳入即可:
read_arrf("adult_census_19210979.arff")
不過(guò)其實(shí)scipy已經(jīng)含有讀取這種常規(guī)的arff文件的方法:import pandas as pd
from scipy.io import arff
data, _ = arff.loadarff("adult_census_19210979.arff")
df = pd.DataFrame(data)
df
不一樣的地方主要在于字符串都會(huì)讀成字節(jié)的形式。稀疏矩陣形式的arff文件讀取
這只是開(kāi)胃小菜,昨天有位即將從電子科技大學(xué)畢業(yè)的網(wǎng)友聯(lián)系到我,說(shuō)arff文件不僅僅只有上面的存儲(chǔ)形式,還有以稀疏矩陣的格式存儲(chǔ)的。
數(shù)據(jù)文件來(lái)源:http://sites.labic.icmc.usp.br/text_collections/?C=D;O=A

以稀疏矩陣形式存儲(chǔ)時(shí),存儲(chǔ)格式是指定位置存對(duì)應(yīng)的值(空格分割)。最終完整的讀取代碼為:
import pandas as pd
def read_sparse_arrf(file):
with open(file, encoding="utf-8") as f:
header = []
default_field = {}
field_num = 0
for line in f:
if line.startswith("@attribute") or line.startswith("@ATTRIBUTE"):
_, name, field_type = line.split()
header.append(name)
if field_type.startswith("{"):
default_field[field_num] = field_type[1:-1].split(",")[0]
field_num += 1
elif line.startswith("@data") or line.startswith("@DATA"):
break
default_field_keys = set(default_field.keys())
width = len(header)
data = []
for line in f:
line = line.strip()
if not line:
continue
tmp = [0]*width
flags = set()
for kv in line[1:-1].split(","):
k, v = kv.split()
k = int(k)
if k not in default_field_keys:
v = int(v)
flags.add(k)
tmp[k] = v
for k in default_field_keys-flags:
tmp[k] = default_field[k]
data.append(tmp)
return pd.DataFrame(data, columns=header)
測(cè)試讀?。?/p>
df = read_sparse_arrf("CSTR_sparse.arff")
df

df = read_sparse_arrf("CSTR_sparse.arff")
df

df = read_sparse_arrf("oh15.arff")
df
注意:上面代碼假設(shè)了稀疏矩陣形式的arrf文件,非{}可選形式,均為數(shù)值類型。推薦閱讀
評(píng)論
圖片
表情
