私はタブ区切りのファイルを持っている:対応する値でSFrameヘッダにユニークな列を変換
$ echo -e 'abc\txyz\t0.9\nefg\txyz\t0.3\nlmn\topq\t0.23\nabc\tjkl\t0.5\n' > test.txt
$ cat test.txt
abc xyz 0.9
efg xyz 0.3
lmn opq 0.23
abc jkl 0.5
$ python
>>> from sframe import SFrame
>>> sf = SFrame.read_csv('test.txt', header=False, delimiter='\t', column_type_hints=[unicode, unicode, float])
[INFO] sframe.cython.cy_server: SFrame v2.1 started. Logging /tmp/sframe_server_1479718846.log
>>> sf
Columns:
X1 str
X2 str
X3 float
Rows: 4
Data:
+-----+-----+------+
| X1 | X2 | X3 |
+-----+-----+------+
| abc | xyz | 0.9 |
| efg | xyz | 0.3 |
| lmn | opq | 0.23 |
| abc | jkl | 0.5 |
+-----+-----+------+
[4 rows x 3 columns]
目標は「X1」で構成された1つの一意の行があります異なるSFrameを達成することであるが私はSFrameせずにそれをやってみました
+-----+-----+-----+------+
| X1 | xyz | opq | jkl |
+-----+-----+-----+------+
| abc | 0.9 | 0.0 | 0.5 |
+-----+-----+-----+------+
| efg | 0.3 | 0.0 | 0.0 |
+-----+-----+-----+------+
| lmn | 0.0 | 0.23| 0.0 |
+-----+-----+-----+------+
:列はすなわち、 'X2' からの値です
>>> import io
>>> with io.open('test.txt', 'r', encoding='utf8') as fin:
... for line in fin:
... if line.strip():
... s,t,p = line.strip().split('\t')
... matrix[(s,t)] = float(p)
...
>>> matrix
{(u'abc', u'jkl'): 0.5, (u'abc', u'xyz'): 0.9, (u'lmn', u'opq'): 0.23, (u'efg', u'xyz'): 0.3}
>>> col1, col2 = zip(*matrix.keys())
>>> [[matrix.get((c1,c2), 0.0) for c2 in col2] for c1 in col1]
[[0.5, 0.9, 0.0, 0.9], [0.5, 0.9, 0.0, 0.9], [0.0, 0.0, 0.23, 0.0], [0.0, 0.3, 0.0, 0.3]]
>>> import numpy as np
>>> np.array([[matrix.get((c1,c2), 0.0) for c2 in col2] for c1 in col1])
array([[ 0.5 , 0.9 , 0. , 0.9 ],
[ 0.5 , 0.9 , 0. , 0.9 ],
[ 0. , 0. , 0.23, 0. ],
[ 0. , 0.3 , 0. , 0.3 ]])
>>> SFrame(np.array([[matrix.get((c1,c2), 0.0) for c2 in col2] for c1 in col1]))
Columns:
X1 array
Rows: 4
Data:
+-----------------------+
| X1 |
+-----------------------+
| [0.5, 0.9, 0.0, 0.9] |
| [0.5, 0.9, 0.0, 0.9] |
| [0.0, 0.0, 0.23, 0.0] |
| [0.0, 0.3, 0.0, 0.3] |
+-----------------------+
[4 rows x 1 columns]
しかし、それでも私は希望のSFrameを取得しません。 一意の列を対応する値を持つSFrameヘッダーに変換する方法を教えてください。I。達成:
+-----+-----+-----+------+
| X1 | xyz | opq | jkl |
+-----+-----+-----+------+
| abc | 0.9 | 0.0 | 0.5 |
+-----+-----+-----+------+
| efg | 0.3 | 0.0 | 0.0 |
+-----+-----+-----+------+
| lmn | 0.0 | 0.23| 0.0 |
+-----+-----+-----+------+
これを行うには簡単な方法が必要です。一意ではないと想像してください。列要素の最大100万になる可能性があり、SFrameのサイズが1,000,000 X 1,000,000になる可能性があります。したがって、SFrameまたはHDFはデータ構造のように必要であり、リストの数が少ない配列やネイティブのpythonリストではありません。
これはパンダを使用して、本当に簡単ですDataFrame。あなたのデータのサイズを考えると、 'sd.to_dataframe()'を使って一時的にSFrameに変換することは可能でしょうか? –