簡體   English   中英

用pandas和numpy解析冒號分隔的稀疏數據

[英]Parsing colon separated sparse data with pandas and numpy

我想以pandas / numpy中的col_index:value格式解析數據文件。 例如:

0:23 3:41 1:31 2:65

將對應於此矩陣:

[[23 0 0 41] [0 31 65 0]]

這似乎是表示文件中稀疏數據的一種很常見的方法,但是我找不到一種簡便的方法來解析此數據,而不必在調用read_csv之后進行某種迭代。

我最近發現這實際上是svm-light格式,您可以使用svm loader來讀取像這樣的數據集:

http://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_svmlight_file.html

因此,逐行解析文件是一個選項,例如:

from scipy.sparse import coo_matrix

rows, cols, values = [], [], []

with open('sparse.txt') as f:
    for i, line in enumerate(f):
        for cell in line.strip().split(' '):
            col, value = cell.split(':')
            rows.append(i)
            cols.append(int(col))
            values.append(int(value))

matrix = coo_matrix((values, (rows, cols)))

print matrix.todense()

還是您需要更快的單步實施? 不知道這是否可能。

編輯#1:您可以避免使用正則表達式一步一步地將每一行拆分成一行,從而導致以下替代實現:

import numpy as np
from scipy.sparse import coo_matrix
import re

rows, cols, values = [], [], []

with open('sparse.txt') as f:
    for i, line in enumerate(f):
        numbers = map(int, re.split(':| ', line))
        rows.append([i] * (len(numbers) / 2))
        cols.append(numbers[::2])
        values.append(numbers[1::2])

matrix = coo_matrix((np.array(values).flatten(),
                     (np.array(rows).flatten(),
                      np.array(cols).flatten())))

print matrix.todense()

編輯#2:我發現了沒有顯式循環的更短解決方案:

from scipy.sparse import coo_matrix, vstack

def parseLine(line):
    nums = map(int, line.split(' '))
    return coo_matrix((nums[1::2], ([0] * len(nums[0::2]), nums[0::2])), (1, 4))

with open('sparse.txt') as f:
    lines = f.read().replace(':', ' ').split('\n')
    cols = max(map(int, " ".join(lines).split(" "))[::2])
    M = vstack(map(parseLine, lines))

print M.todense()

該循環隱藏在作用於linesmap命令中。 我認為根本沒有沒有循環的解決方案,因為大多數內置函數都使用循環,並且許多字符串解析方法(如re.finditer僅產生迭代器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM