Pyspark에서 범주 형 데이터를 숫자 형 데이터로 변환하는 방법


11

pyspark 애플리케이션으로 작업하기 위해 Ipython 노트북을 사용하고 있습니다. 소득이 50k 범위 이하인지 여부를 결정하기 위해 범주 열이 많은 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)

이것은 범주 형 데이터를 숫자 데이터로 변환하기 위해 일반 파이썬으로 작성한 코드입니다. 잘 작동합니다. 스파크 컨텍스트에서 변환을 수행하고 싶습니다. 그리고 데이터 소스에는 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

안녕, mapr 함수는 범주 값과 관련된 숫자 값을 반환합니다. 예 : 'Self-emp-not-inc'의 경우 python 사전은 순서가 없습니다. 정렬 된 사전을 원하면 collections.OrderedDict를 시도하십시오.
Sreejithc321

이제 기능을 이해합니다. 문제는 수천 개의 행이있는 CSV가 있으며 사전에 언급 된 값 중 하나가 포함 된 Workclass라는 열이 있다는 것입니다. 따라서 각 행마다 텍스트를 사전과 비교하여 해당 열의 텍스트를 숫자로 변경하고 해당 숫자를 대체해야합니다. 함수를 사용하여 열을 행으로 구문 분석하고 값을 사전과 비교하는 방법은 무엇입니까?
SRS

범주 형 값에 해당하는 숫자 값을 저장하는 'workclass_num'과 같은 추가 열을 만들 수 있습니다. Python Pandas 라이브러리를 확인하십시오.
Sreejithc321
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.