Pandas - 使用另一列的值进行独热编码

3

我有一个如下的数据框:

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    

我希望使用pandas中的'get_dummies'和'groupby'方法,对'loc'列进行一位有效编码,并用'vol'值填充新创建的一位有效编码列。我的预期输出如下。我的挑战是我无法将'vol'列的值填充到新创建的一位有效编码列中。已经尝试了两天,但仍未找到解决方法。希望您能给我一些提示。

预期结果

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
2个回答

3

您可以做的事情

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

1
我理解为,
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

4
我觉得他需要在输出中包含“vol”这个词。 :-) - BENY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接