对数据帧的编码与单点不同

问题描述 投票:0回答:2

假设我有一个类似的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)

[当我使用熊猫的get_dummies时,将获得具有以下结构的稀疏df(示例,而不是示例df中的实际编码)

对于每个团队,每个选择位都有每个可能的选择(A-Z)。

| 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个团队)熊猫可以通过任何内置函数来做到这一点吗?如果不是,最简单的方法是什么?

任何帮助表示赞赏!谢谢。

python pandas dataframe sparse-matrix one-hot-encoding
2个回答
0
投票

您可以通过以下方式首先选择一个团队:filterstack数据并使用str.get_dummies,然后选择groupby level = 0(原始df中的行)和sumadd_prefixconcat之前的两支队伍,例如:

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  

0
投票

如果仅需要get_dummies值,则将max与聚合1,0一起使用;如果需要计数值,则sum

df_enc = (pd.get_dummies(df)
            .rename(columns= lambda x: x.split('_', 2)[-1].replace('team', 'T'))
            .max(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_Q  T2_S  \
0     1     0     0     1     0     0     1     0     0     0     1     0   
1     1     0     0     1     0     0     1     0     0     0     1     0   
2     1     0     0     0     1     0     0     0     0     0     0     1   
3     0     1     0     0     0     1     0     1     0     1     0     1   
4     0     0     1     0     0     1     0     0     1     1     0     0   

   T2_B  T2_V  T2_W  T2_X  T2_R  
0     0     1     0     0     1  
1     0     0     1     1     0  
2     0     0     1     1     0  
3     0     0     1     0     0  
4     1     0     0     0     1  
© www.soinside.com 2019 - 2024. All rights reserved.