Pysparkでカテゴリデータを数値データに変換する方法


11

私はIpythonノートブックを使用してpysparkアプリケーションを操作しています。収入が5万人の範囲に収まるかそれ以上かを判断するための多数のカテゴリ列を含むCSVファイルがあります。すべての入力を使用して分類アルゴリズムを実行し、収入の範囲を決定したいと思います。マップされた変数に変数のディクショナリーを作成し、マップ関数を使用して変数を処理する数値にマップする必要があります。基本的に、モデルの実装に取り​​掛かれるように、データセットは数値形式にする必要があります。

データセットには、教育、婚姻状況、労働者階級などのカテゴリ列があります。pysparkで数値列に変換する方法を誰かに教えてもらえますか?

workclass = {'?':0,'Federal-gov':1,'Local-gov':2,'Never-  worked':3,'Private':4,'Self-emp-inc':5,'Self-emp-not-inc':6,'State-gov':7,'Without-pay':8}

ワーククラスのキーと値のペアを含むサンプルディクショナリを作成しました。しかし、これをマップ関数で使用して、CSVファイルのカテゴリデータを対応する値に置き換える方法がわかりません。

wc = pd.read_csv('PATH', usecols = ['Workclass'])

df = pd.DataFrame(wc)
wcdict = {' ?':0,' Federal-gov':1,' Local-gov':2,' Never-worked':3,' Private':4,' Self-emp-inc':5,' Self-emp-n-inc':6,' State-gov':7,' Without-pay':8}
df_new = df.applymap(lambda s: wcdict.get(s) if s in wcdict else s)
print(df_new)

これは、カテゴリデータを数値データに変換するために通常のpythonで記述したコードです。正常に動作します。スパークのコンテキストで変換を実行したい。また、データソースには9つのカテゴリ列があります。辞書の更新プロセスを自動化して9列すべてにKVペアを設定する方法はありますか?

回答:


14

これはStringIndexerPySpark で行うことができ、その逆IndexToStringは参考のために確認してください:

from pyspark.ml.feature import StringIndexer

df = sqlContext.createDataFrame(
    [(0, "a"), (1, "b"), (2, "c"), (3, "a"), (4, "a"), (5, "c")],
    ["id", "category"])
indexer = StringIndexer(inputCol="category", outputCol="categoryIndex")
indexed = indexer.fit(df).transform(df)
indexed.show()

詳細については、sparkのドキュメントを確認してください


2
workclass = {'?':0,'Federal-gov':1,'Local-gov':2,'Never-  worked':3,'Private':4,'Self-emp-inc':5,'Self-emp-not-inc':6,'State-gov':7,'Without-pay':8}

キーを返すマッパー関数を定義してみてください:

def mapr(dict_key):
    return workclass[dict_key]

print list(map(mapr,workclass))

ねえ、このブロックが何をするか説明してくれませんか?このコードを追加してスクリプトを実行し、出力として[6、1、4、3、5、7、8、0、2]を取得しました。辞書の値を使用して、ワーククラスコンテンツに数値を代入したい。
SRS 2015年

こんにちは、mapr関数は、カテゴリ値に関連付けられた数値を返します。例: 'Self-emp-not-inc'の6、python辞書は順不同です。順序付き辞書が必要な場合は、collections.OrderedDictを試してください。
Sreejithc321

さて、私は機能を理解しました。問題は、数千行のCSVがあり、辞書に記載されている値のいずれかを含むWorkclassという名前の列があることです。したがって、各行について、テキストを辞書と比較して、その列のテキストを数値に変更し、対応する番号に置き換える必要があります。関数を使用して行ごとに列を解析し、値を辞書と比較するにはどうすればよいですか?
SRS 2015年

カテゴリ値に対応する数値を格納する「workclass_num」などの追加の列を作成できます。Python Pandasライブラリを確認してください。
Sreejithc321 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.