วิธี vectorize นี้ pandas ปฏิบัติการ?

0

คำถาม

ฉันมีวันที่ของรูปร่าง 4200,8. แถวแรกดูเหมือนนี้:

X0  X1  X2  X3  X4  X5  X6  X8
32  23  17  0   3   24  9   14

แต่ละคืนค่าเป็น categorical การเข้ารหัสอักขระนั่น corresponds ต้องการรายชื่อของ 30 ค่าของมันดูเหมือนนี้:

[ 0.06405287, -0.1176078 , -0.06206927,  0.08389127, -0.18036067,
  0.35158703, -0.0928449 , -0.0974429 , -0.06705306, -0.17196381,
 -0.03776502,  0.09204011,  0.47813812,  0.16258538,  0.2699648 ,
  0.07496626, -0.09791522, -0.31499937, -0.24898018,  0.06126055,
  0.13187763,  0.21042736, -0.1585868 ,  0.08355565, -0.13935572,
  0.12408883,  0.2043313 , -0.12544186, -0.09223691,  0.00720569 ]

เป้าหมายของฉันคือจะสร้างคอลัมน์สำหรับแต่ละค่าอยู่ในรายการที่ตำแหน่งของรายการเป็นที่สัมพันธ์กัน categorical การเข้ารหัส รายการด้านบ corresponds ที่ค่า 14 ในคอลัมน์ X8ดังนั้นแทนที่จะเป็น: X8 : 14 ฉันต้อง:

X8_1 X8_2 X8_3 ... X8_29 X8_30
0.06 -0.11 -0.62 ...-0.09 0.007

ผลสุดท้ายก็จบลงเป็นของฉัน dataframe ของ 8 คอลัมน์ก็จะกลายเป็น dataframe ของ 240 ๆคอลัมน์ แน่นอนว่างแต่ละแถวด้วมีอีกตั้งของค่า. นี่เป็นวิธีที่ฉันเคยทำมัน: ผมได้รับค่าพิเศษอยู่ในคอลัมน์สร้างพจนานุกรมของ colname:uniqueval:indexoflist:listvalatindex. งั้นฉันสร้างพจนานุกรมออกของแต่ละแถวด้วงของ dataframe และสำหรับแต่ละคอลัมน์และค่าในคอลัมน์ฉันไปเอารายการที่สัมพันธ์กันและ concatenate. งั้นฉัน concatenate แถวนั้นไปก่อนหน้านั่น

weights = {}
for index, x in enumerate(encoded.columns): #this is the dataset with the original encoded values
  weights[x] = {}
  for id, val in enumerate(encoded[x].unique()):
    weights[x][val] = {}
    for weightid, weightval in enumerate(model_full.get_layer(embeddings[index]).get_weights()[0][id]): #this is where I get the list of 30 values from
      weights[x][val][weightid] = weightval

mappedembeddings = pd.DataFrame()
encodedindex = []
for row in encoded.iterrows(): #iterate over original dataset
  encodedindex.append(row[0]) #store index for later
  df0 = pd.DataFrame()
  for k, v in row[1].to_dict().items(): #for each key/val in row
    names = []
    for z in weights[k][v].keys():
      names.append(str(k)+'_'+str(z)) #naming (z is key of list value)

    tempdf = pd.DataFrame([weights[k][v]]) #dataframe of list at column/value key in dictionary made from embedding layer list
    tempdf.columns = names
    df0 = pd.concat([df0,tempdf],axis=1) 

  mappedembeddings = pd.concat([mappedembeddings,df0],axis=0) #concat row to previous row
  
mappedembeddings.index = encodedindex

มันต้องใช้เวลานาน ฉันอยากจะ vectorize ปฏิบัติการนี้แต่ฉันไม่มั่นใจยังไงต้องดำเนินการดังนั้นฉันจะซาบซึ้งมากบางข้อมูลเชิงลึก.

dictionary mapping pandas python
2021-11-23 17:48:07
1

คำตอบที่ดีที่สุด

1
  1. map แต่ละคอลัมน์ของคุณค่าที่ respective รายชื่อ
  2. explode ที่รายชื่อต้องแต่ละแถวแล้ว stack
  3. สร้างที่ต้องคอลัมน์รายชื่อกัน groupby
  4. pivot เพื่อให้การส่งออก
values = df.apply(lambda x: x.map(weights[x.name]))
values = values.explode(list(values.columns)).stack().reset_index()
values["column"] = values["level_1"] + "_" + (values.groupby(["level_0", "level_1"]).transform("cumcount")+1).astype(str)
output = values.pivot("level_0", "column", 0)
เต็มทำงานตัวอย่าง:
import pandas as pd
import numpy as np

np.random.seed(100)

#random dataframe with three columns X0 X1 and X2
df = pd.DataFrame(data = np.random.randint(30, size=(2,3)),
                  columns = [f"X{i}" for i in range(3)]
                  )

#creating weights dictionary 
#weights[col][number]: list of 5 numbers
weights = dict()
for c in df.columns:
    weights[c] = {num: np.random.rand(5) for num in df[c].unique()}
    
values = df.apply(lambda x: x.map(weights[x.name]))
values = values.explode(list(values.columns)).stack().reset_index()
values["column"] = values["level_1"] + "_" + (values.groupby(["level_0", "level_1"]).transform("cumcount")+1).astype(str)
output = values.pivot("level_0", "column", 0)

>>> output
column       X0_1      X0_2      X0_3  ...      X2_3      X2_4      X2_5
level_0                                ...                              
0        0.844776  0.004719  0.121569  ...  0.372832  0.005689  0.252426
1        0.136707  0.575093  0.891322  ...  0.598843  0.603805  0.105148

[2 rows x 15 columns]
2021-11-24 14:28:13

ทำงานได้ยอดเยี่ยม! ขอบคุณของคุณ pandas ทักษะมากมายช่างน่าประทับใจ ระเบิดอาละวาดซึ่งก็น่าสงสั()เป็นประโยชน์ฟังก์ชันที่ผมพลาดไป ขอบคุณอีกครั้ง!
Bigboss01

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่