【问题标题】:Pandas - One Hot Encoding using values from another ColumnPandas - 使用来自另一列的值进行热编码
【发布时间】:2020-06-25 16:39:20
【问题描述】:

我有一个如下的数据框,

idx vol loc             
0   1   2   unit 68             
1   1   1   unit 179                
2   1   2   unit 345                
3   2   1   unit 233                
4   2   1   unit 235                
5   2   2   unit 313                
6   2   1   unit 313    

我的目标是对“loc”列进行 one-hot 编码,并将“vol”值填充到 one-hot 编码列中。热衷于在 pandas 中使用 'get_dummies' 和 'groupby' 方法。

我的预期输出如下。我的挑战是我无法在新创建的 one-hot 编码列中填充“vol”列中的值。

尝试了 2 天,但仍然没有找到解决方法。希望你能给我一个提示。

预期

loc unit 179    unit 233    unit 235    unit 312    unit 313    unit 345    unit 68
id                          
1   1   0   0   0   0   2   2
2   0   1   1   0   3   0   0

MWE

import pandas as pd

data =  {'idx': [1, 1, 1, 2, 2, 2, 2],
         'vol': [2, 1, 2, 1, 1, 2, 1],
         'loc': ['unit 68', 'unit 179', 'unit 345', 'unit 233', 'unit 235', 'unit 313', 'unit 313']}

df = pd.DataFrame(data)

# Syntax
# pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None) → ’DataFrame’

df = pd.get_dummies(df, columns=['loc'], prefix='', prefix_sep='')
print(df)

df = df.groupby('idx').agg(sum)
print(df)

输出

   idx  vol  unit 179  unit 233  unit 235  unit 313  unit 345  unit 68
0    1    2         0         0         0         0         0        1
1    1    1         1         0         0         0         0        0
2    1    2         0         0         0         0         1        0
3    2    1         0         1         0         0         0        0
4    2    1         0         0         1         0         0        0
5    2    2         0         0         0         1         0        0
6    2    1         0         0         0         1         0        0

     vol  unit 179  unit 233  unit 235  unit 313  unit 345  unit 68
idx                                                                
1      5         1         0         0         0         1        1
2      5         0         1         1         2         0        0

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以的

    df=df.set_index('idx')
    s=df['loc'].str.get_dummies().mul(df['vol'],axis=0).sum(level=0)
         unit179  unit233  unit235  unit313  unit345  unit68
    idx                                                     
    1          1        0        0        0        2       2
    2          0        1        1        3        0       0
    

    【讨论】:

      【解决方案2】:

      IIUC,

      df.pivot_table('vol', 'idx', 'loc', aggfunc='sum', fill_value=0)
      

      输出:

      loc  unit 179  unit 233  unit 235  unit 313  unit 345  unit 68
      idx                                                           
      1           1         0         0         0         2        2
      2           0         1         1         3         0        0
      

      还要加总,

      df.pivot_table('vol', 'idx', 'loc', aggfunc='sum', 
                     fill_value=0, margins=True, margins_name='vol')
      

      输出:

      loc  unit 179  unit 233  unit 235  unit 313  unit 345  unit 68  vol
      idx                                                                
      1           1         0         0         0         2        2    5
      2           0         1         1         3         0        0    5
      vol         1         1         1         3         2        2   10
      

      删除行总计:

      df.pivot_table('vol', 'idx', 'loc', aggfunc='sum', 
                     fill_value=0, margins=True, margins_name='vol')\
        .drop('vol')
      

      输出:

      loc  unit 179  unit 233  unit 235  unit 313  unit 345  unit 68  vol
      idx                                                                
      1           1         0         0         0         2        2    5
      2           0         1         1         3         0        0    5
      

      【讨论】:

      • 我觉得他也需要在输出中包含 vol :-)
      猜你喜欢
      • 2018-03-01
      • 2014-07-18
      • 2017-05-02
      • 2022-11-12
      • 2017-10-24
      • 2020-03-12
      • 2021-04-15
      • 2021-01-06
      • 2021-05-13
      相关资源
      最近更新 更多