亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

以不同于 One-Hot 的方式編碼 Dataframe

以不同于 One-Hot 的方式編碼 Dataframe

智慧大石 2022-12-06 14:54:54
假設我有一個類似的 df,它記錄了計算機游戲中 6 個玩家 (3v3) 中每個玩家的可玩角色選擇。data = {'Pick_1_team1': ['A','A','A','B','C'],        'Pick_2_team1': ['D','D','E','F','F'],        'Pick_3_team1': ['G','G','A','M','O'],        'Pick_1_team2': ['Q','Q','S','S','A'],        'Pick_2_team2': ['V','W','X','A','B'],        'Pick_3_team2': ['R','X','W','W','R']}df = pd.DataFrame(data)df_enc = pd.get_dummies(df)當我使用 panda 的 get_dummies 時,我將得到一個具有以下結構的稀疏 df(例如,不是來自示例 df 的實際編碼)每個 Pick-slot 都有每個可能的選擇 (AZ),適用于兩支球隊。| P1_T1_A | P1_T1_B | P1_T1_C | ... | P2_T1_A | ... | P3_T1_Z | ... | P1_T2_A | P1_T2_B | ... | P3_T2_Z ||---------|---------|---------|-----|---------|-----|---------|-----|---------|---------|-----|---------|| 0       | 0       | 1       | ... | 0       | ... | 0       | ... | 1       | 0       | ... | 1       || 1       | 0       | 0       | ... | 0       | ... | 0       | ... | 0       | 1       | ... | 1       || 1       | 0       | 0       | ... | 0       | ... | 0       | ... | 0       | 0       | ... | 0       |這沒關系,但如果您考慮更大的輸入空間(有 150 多個可能的選擇),表格會變得非常大。為了使其更易于管理,我正在考慮以某種方式將其編碼為以下格式:每個類別(角色)一列 x 每個團隊 2,如果該角色被選中則為 1,否則為 0。| T1_A | T1_B | T1_C | ... | T1_Z | ... | T2_A | T2_B | ... | T2_Z ||------|------|------|-----|------|-----|------|------|-----|------|| 0    | 0    | 1    | ... | 0    | ... | 1    | 1    | ... | 1    || 1    | 1    | 1    | ... | 0    | ... | 0    | 0    | ... | 1    || 1    | 0    | 0    | ... | 0    | ... | 0    | 0    | ... | 0    |這會將特征數量限制為選秀權數 x 球隊數(26 個字母 * 2 支球隊),而不是可能的選秀權數 x 選秀權數 x 球隊數(26 個字母 * 3 個選秀權 * 2 支球隊)熊貓可以通過任何 built_in 做到這一點功能?如果不是,最簡單的方法是什么?任何幫助表示贊賞!謝謝。
查看完整描述

2 回答

?
白衣非少年

TA貢獻1155條經驗 獲得超0個贊

您可以通過首先選擇一個團隊filter,stack數據并使用str.get_dummies,然后選擇groupbylevel=0(原始 df 中的行)和sum。對于兩個團隊add_prefix之前的專欄,例如:concat


df_ = pd.concat([

            (df.filter(like=f'Pick_{i}').stack()

               .str.get_dummies()

               .groupby(level=0).sum()

               .add_prefix(f'T{i}_')

            ) for i in [1,2] ], 

            axis=1)

print (df_)

   T1_A  T1_B  T1_C  T1_D  T1_E  T1_F  T1_G  T1_M  T1_O  T2_A  T2_B  T2_Q  \

0     1     0     0     1     0     0     1     0     0     0     0     1   

1     1     0     0     1     0     0     1     0     0     0     0     1   

2     2     0     0     0     1     0     0     0     0     0     0     0   

3     0     1     0     0     0     1     0     1     0     1     0     0   

4     0     0     1     0     0     1     0     0     1     1     1     0   


   T2_R  T2_S  T2_V  T2_W  T2_X  

0     1     0     1     0     0  

1     0     0     0     1     1  

2     0     1     0     1     1  

3     0     1     0     1     0  

4     1     0     0     0     0  


查看完整回答
反對 回復 2022-12-06
?
HUH函數

TA貢獻1836條經驗 獲得超4個贊

如果只需要值或需要計數值,請get_dummies與聚合一起使用:max1,0sum


df_enc = (pd.get_dummies(df.rename(columns=lambda x:x.split('_', 2)[-1].replace('team','T')))

            .max(axis=1, level=0)

            .sort_index(axis=1, level=0))

print (df_enc)

   T1_A  T1_B  T1_C  T1_D  T1_E  T1_F  T1_G  T1_M  T1_O  T2_A  T2_B  T2_Q  \

0     1     0     0     1     0     0     1     0     0     0     0     1   

1     1     0     0     1     0     0     1     0     0     0     0     1   

2     1     0     0     0     1     0     0     0     0     0     0     0   

3     0     1     0     0     0     1     0     1     0     1     0     0   

4     0     0     1     0     0     1     0     0     1     1     1     0   


   T2_R  T2_S  T2_V  T2_W  T2_X  

0     1     0     1     0     0  

1     0     0     0     1     1  

2     0     1     0     1     1  

3     0     1     0     1     0  

4     1     0     0     0     0  


查看完整回答
反對 回復 2022-12-06
  • 2 回答
  • 0 關注
  • 107 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號