<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 6478字,需瀏覽 13分鐘

           ·

          2021-05-05 05:13

          作者/小小明
          來(lái)源/快學(xué)Python

          常規(guī)arff文件讀取

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

          然后我讓這位群友把文件發(fā)我,給我分析一下,我用文件編輯器打開(kāi)后,發(fā)現(xiàn)格式如下:
          只是一個(gè)文本文本而已,解析文本文件我實(shí)在太擅長(zhǎng)了??梢钥吹剑?/section>
          • 編碼是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
          結(jié)果如下:
          不一樣的地方主要在于字符串都會(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
          結(jié)果如下:
          df = read_sparse_arrf("CSTR_sparse.arff")
          df
          結(jié)果如下:
          df = read_sparse_arrf("oh15.arff")
          df
          結(jié)果如下:
          注意:上面代碼假設(shè)了稀疏矩陣形式的arrf文件,非{}可選形式,均為數(shù)值類型。

          最終這位朋友對(duì)結(jié)果還挺滿意的:我感覺(jué)要感謝這個(gè)朋友指出我沒(méi)有碰到過(guò)的這種arrf格式。

          推薦閱讀


          Pandas處理數(shù)據(jù)太慢,來(lái)試試Polars吧!
          懶人必備!只需一行代碼,就能導(dǎo)入所有的Python庫(kù)
          絕!關(guān)于pip的15個(gè)使用小技巧
          介紹10個(gè)常用的Python內(nèi)置函數(shù),99.99%的人都在用!
          可能是全網(wǎng)最完整的 Python 操作 Excel庫(kù)總結(jié)!

          瀏覽 52
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  北条麻妃一区二区三区 | 曰本无码人妻丰满熟妇啪啪 | 男女AA视频 | 国产亚洲影 | 色婷婷激情四射 |