วิธีการแปลงข้อมูลเด็ดขาดเป็นข้อมูลตัวเลขใน Pyspark


11

ฉันกำลังใช้สมุดบันทึก Ipython เพื่อทำงานกับแอปพลิเคชัน pyspark ฉันมีไฟล์ CSV ที่มีคอลัมน์หมวดหมู่มากมายเพื่อพิจารณาว่ารายได้อยู่ในช่วงหรือมากกว่า 50k ฉันต้องการดำเนินการอัลกอริทึมการจำแนกโดยใช้อินพุตทั้งหมดเพื่อกำหนดช่วงรายได้ ฉันต้องสร้างพจนานุกรมของตัวแปรเพื่อทำแผนที่ตัวแปรและใช้ฟังก์ชั่นแผนที่เพื่อแมปตัวแปรกับตัวเลขสำหรับการประมวลผล โดยพื้นฐานแล้วฉันต้องการให้ชุดข้อมูลของฉันอยู่ในรูปแบบตัวเลขเพื่อให้ฉันสามารถใช้งานโมเดลได้

ในชุดข้อมูลมีคอลัมน์หมวดหมู่เช่นการศึกษาสถานภาพการทำงาน ฯลฯ มีคนบอกวิธีแปลงเป็นคอลัมน์ตัวเลขใน 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 คอลัมน์ในแหล่งข้อมูล มีวิธีใดที่จะทำให้กระบวนการอัปเดตพจนานุกรมเป็นแบบอัตโนมัติเพื่อให้มีคู่ KV สำหรับทั้ง 9 คอลัมน์?

คำตอบ:


14

สิ่งนี้สามารถทำได้โดยใช้StringIndexerใน PySpark และสิ่งที่ตรงกันข้าม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}

ลองกำหนด mapper fuction ซึ่งคีย์ส่งคืน:

def mapr(dict_key):
    return workclass[dict_key]

print list(map(mapr,workclass))

เฮ้คุณช่วยอธิบายให้ฉันฟังได้ไหมว่าบล็อกนี้ทำอะไรได้บ้าง ฉันรันสคริปต์ด้วยรหัสนี้เพิ่มและฉันได้ [6, 1, 4, 3, 5, 7, 8, 0, 2] เป็นผลลัพธ์ ฉันต้องการแทนที่ค่าตัวเลขให้กับเนื้อหาของคลาสงานโดยใช้ค่าในพจนานุกรม
SRS

สวัสดีฟังก์ชั่น mapr จะคืนค่าตัวเลขที่เกี่ยวข้องกับค่าหมวดหมู่ เช่น: 6 สำหรับ 'Self-emp-not-inc', พจนานุกรมหลามไม่มีการเรียงลำดับ หากคุณต้องการพจนานุกรมที่สั่งซื้อลองคอลเลกชันสั่งทำ
Sreejithc321

ตกลงตอนนี้ฉันเข้าใจฟังก์ชั่น สิ่งนี้คือฉันมี CSV ที่มีหลายพันแถวและมีคอลัมน์ชื่อ Workclass ซึ่งมีค่าใดค่าหนึ่งที่ระบุไว้ในพจนานุกรม ดังนั้นสำหรับแต่ละแถวฉันต้องเปลี่ยนข้อความในคอลัมน์นั้นเป็นตัวเลขโดยเปรียบเทียบข้อความกับพจนานุกรมและแทนที่ตัวเลขที่เกี่ยวข้อง ฉันจะใช้ฟังก์ชันแยกวิเคราะห์คอลัมน์เป็นแถวและเปรียบเทียบค่ากับพจนานุกรมได้อย่างไร
SRS

คุณสามารถสร้างคอลัมน์เพิ่มเติมว่า 'workclass_num' ซึ่งเก็บค่าตัวเลขที่สอดคล้องกับค่าหมวดหมู่ ตรวจสอบไลบรารี Python Pandas
Sreejithc321
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.