12

からの行列が与えられるSFrame:

>>> from sframe import SFrame
>>> sf =SFrame({'x':[1,1,2,5,7], 'y':[2,4,6,8,2], 'z':[2,5,8,6,2]})
>>> sf
Columns:
    x   int
    y   int
    z   int

Rows: 5

Data:
+---+---+---+
| x | y | z |
+---+---+---+
| 1 | 2 | 2 |
| 1 | 4 | 5 |
| 2 | 6 | 8 |
| 5 | 8 | 6 |
| 7 | 2 | 2 |
+---+---+---+
[5 rows x 3 columns]

xおよび列の一意の値を取得したいので、次のyように実行できます。

>>> sf['x'].unique().append(sf['y'].unique()).unique()
dtype: int
Rows: 7
[2, 8, 5, 4, 1, 7, 6]

このようにして、x の一意の値と y の一意の値を取得し、それらを追加して、追加されたリストの一意の値を取得します。

私はそのようにすることもできます:

>>> sf['x'].append(sf['y']).unique()
dtype: int
Rows: 7
[2, 8, 5, 4, 1, 7, 6]

しかし、そのように、x 列と y 列が巨大で重複が多い場合は、一意のものを取得する前に非常に巨大なコンテナーに追加します。

SFrame の 2 つ以上の列から作成された結合された列の一意の値を取得するより効率的な方法はありますか?

の2つ以上の列から一意の値を取得する効率的な方法のパンダの同等性は何pandasですか?

4

6 に答える 6

2

私が考えることができる最も簡単な方法は、numpy 配列に変換してから一意の値を見つけることです

np.unique(sf[['x', 'y']].to_numpy())

array([1, 2, 4, 5, 6, 7, 8])

sframe で必要な場合

SFrame({'xy_unique': np.unique(sf[['x', 'y']].to_numpy())})

ここに画像の説明を入力

于 2016-08-19T17:12:04.657 に答える
2

SFrame

私は SFrame を使用したことがなく、データをコピーする条件がわかりません。(データをメモリに選択sf['x']またはコピーしますか?)。appendSFrame にはpack_columnsstackメソッドがあり、それらがデータをコピーしない場合、これは機能するはずです:

sf[['x', 'y']].pack_columns(new_column_name='N').stack('N').unique()

パンダ

データがメモリに収まる場合は、追加のコピーなしで pandas で効率的に実行できる可能性があります。

# copies the data to memory
df = sf[['x', 'y']].to_dataframe()

# a reference to the underlying numpy array (no copy)
vals = df.values

# 1d array: 
# (numpy.ravel doesn't copy if it doesn't have to - it depends on the data layout)
if np.isfortran(vals):
    vals_1d = vals.ravel(order='F')
else:
    vals_1d = vals.ravel(order='C')

uniques = pd.unique(vals_1d)

pandasはソートされないためunique、numpy よりも効率的です。np.unique

于 2016-08-19T17:12:47.390 に答える
1

以下は、考えられる 3 つの方法の間の小さなベンチマークです。

from sframe import SFrame
import numpy as np
import pandas as pd
import timeit

sf = SFrame({'x': [1, 1, 2, 5, 7], 'y': [2, 4, 6, 8, 2], 'z': [2, 5, 8, 6, 2]})


def f1(sf):
    return sf['x'].unique().append(sf['y'].unique()).unique()


def f2(sf):
    return sf['x'].append(sf['y']).unique()


def f3(sf):
    return np.unique(sf[['x', 'y']].to_numpy())

N = 1000

print timeit.timeit('f1(sf)', setup='from __main__ import f1, sf', number=N)
print timeit.timeit('f2(sf)', setup='from __main__ import f2, sf', number=N)
print timeit.timeit('f3(sf)', setup='from __main__ import f3, sf', number=N)

# 13.3195129933
# 4.66225642657
# 3.65669089489
# [Finished in 23.6s]

windows7+i7_2.6ghz で python2.7.11 x64 を使用したベンチマーク

結論: np.uniqueを使用することをお勧めします。これは基本的にf3です。

于 2016-08-25T20:18:00.933 に答える