熊猫 - 地图 - 虚拟变量 - 赋值1

时间:2017-12-24 17:50:42

标签: python pandas dataframe dummy-variable

我有两个数据框,x.head()如下所示:

top      mid       adc      support jungle
Irelia   Ahri      Jinx     Janna   RekSai
Gnar     Ahri      Caitlyn  Leona   Rengar
Renekton Fizz      Sivir    Annie   Rengar
Irelia   Leblanc   Sivir    Thresh  JarvanIV
Gnar     Lissandra Tristana Janna   JarvanIV
我创建的

和dataframe fullmatrix.head()如下所示:

Irelia  Gnar    Renekton    Kassadin    Sion    Jax Lulu    Maokai  Rumble  Lissandra   ... XinZhao Amumu   Udyr    Ivern   Shaco   Skarner FiddleSticks    Aatrox  Volibear    MonkeyKing
0   0   0   0   0   0   0   0   0   0   0   ... 0   0   0   0   0   0   0   0   0   0
1   0   0   0   0   0   0   0   0   0   0   ... 0   0   0   0   0   0   0   0   0   0
2   0   0   0   0   0   0   0   0   0   0   ... 0   0   0   0   0   0   0   0   0   0
3   0   0   0   0   0   0   0   0   0   0   ... 0   0   0   0   0   0   0   0   0   0
4   0   0   0   0   0   0   0   0   0   0   ...

现在我无法弄清楚的是如何为x数据帧中的每个名称赋值为1的fullmatrix数据帧中具有相同名称的相应列(两个数据帧都相同)行数)。

3 个答案:

答案 0 :(得分:2)

OP尝试使用一组数据点创建虚拟变量表。对于每个数据点,它包含5个属性。共有N个唯一属性。

我们将使用简化的数据集来演示如何操作:

  • 5个独特属性
  • 3个数据条目
  • 每个数据条目包含3个属性。

    x = pd.DataFrame([['a', 'b', 'c'],  
                      ['b', 'd', 'e'], 
                      ['e', 'b', 'a']])
    fullmatrix = pd.DataFrame([[0 for _ in range(5)] for _ in range(3)], 
                              columns=['a','b','c','d','e'])
    """ fullmatrix:
       a  b  c  d  e
    0  0  0  0  0  0
    1  0  0  0  0  0
    2  0  0  0  0  0
    """
    
    # each row in x_temp is a string of attributed delimited by ","
    x_row_joined = pd.Series((",".join(row[1]) for row in x.iterrows()))    
    fullmatrix = x_row_joined.str.get_dummies(sep=',')
    

该方法的灵感来自offbyoneanswer它使用pandas.Series.str.get_dummies。我们首先使用指定的分隔符连接x的每一行。然后使用Series.str.get_dummies方法。该方法采用我们仅用于连接属性的分隔符,并将为您生成虚拟变量表。 (注意:不要选择x中存在的sep。)

答案 1 :(得分:2)

考虑添加key = 1列,然后遍历每一列以获取已转动的dfs列表,然后将其与pd.concat水平合并。最后运行DataFrame.update()以使用 pvt_df 中的值更新原始 fullmatrix ,并与index对齐。

x['key'] = 1

dfs = []
for col in x.columns[:-1]:
    dfs.append(x.pivot_table(index=df.index, columns=[col], values='key').fillna(0))

pvt_df = pd.concat(dfs, axis=1).astype(int)

fullmatrix.update(pvt_df)
fullmatrix = fullmatrix.astype(int)

fullmatrix   # ONLY FOR VISIBLE COLUMNS IN ORIGINAL POST
#    Irelia  Gnar  Renekton  Kassadin  Sion  Jax  Lulu  Maokai  Rumble  Lissandra  XinZhao  Amumu  Udyr  Ivern  Shaco  Skarner  FiddleSticks  Aatrox  Volibear  MonkeyKing
# 0       1     0         0         0     0    0     0       0       0          0        0      0     0      0      0        0             0       0         0           0
# 1       0     1         0         0     0    0     0       0       0          0        0      0     0      0      0        0             0       0         0           0
# 2       0     0         1         0     0    0     0       0       0          0        0      0     0      0      0        0             0       0         0           0
# 3       1     0         0         0     0    0     0       0       0          0        0      0     0      0      0        0             0       0         0           0

答案 2 :(得分:2)

我确信这可以改进,但一个优点是它只需要第一个DataFrame,并且在获得所需的解决方案之前,它在概念上很好地连接操作。

fullmatrix = (x.stack()
               .reset_index(name='names')
               .pivot(index='level_0', columns='names', values='names')
               .applymap(lambda x: int(x!=None))
               .reset_index(drop=True))

请注意,只有x数据框中显示的名称才会显示为fullmatrix中的列。如果你想要额外的列,你可以简单地执行连接。