使用Pandas Python重塑为二进制变量

时间:2018-07-03 07:27:20

标签: python pandas dataframe pivot-table

我对Python pandas的ivot_table还是陌生的,如果某个值在特定观察范围内,我会尝试重塑数据以具有二进制指示符。我遵循以前的一些代码并获得了一些令人鼓舞的结果,但是我得到的总和不是1和0。请在下面查看小样本数​​据集

    ID          SKILL     NUM
    1             A        1
    1             A        1
    1             B        1
    2             C        1
    3             C        1
    3             C        1
    3             E        1

我想要的结果是:

    ID    A         B        C    E
    1     1         1        0    0
    2     0         0        1    0
    3     0         0        0    1

我的代码atm得到以下结果:

    ID    A         B        C    E
    1     2         1        0    0
    2     0         0        2    0
    3     0         0        0    1

我应该先删除重复项吗?

我正在使用atm的代码如下;

  df_pivot =  df2.pivot_table(index='Job_posting_ID', columns='SKILL', aggfunc=len, fill_value=0)

3 个答案:

答案 0 :(得分:1)

尝试这样:

df.pivot_table(index='ID', columns='SKILL', values='NUM', aggfunc=lambda x: len(x.unique()), fill_value=0)

或者这个:

df.pivot_table(index='ID', columns='SKILL',aggfunc=lambda x: int(x.any()), fill_value=0)

最适合您的人。

答案 1 :(得分:1)

您可以使用aggfunc='any'并将其转换为int作为单独的步骤。这样可以避免使用lambda /自定义函数,并且效率更高。

df_pivot =  df.pivot_table(index='ID', columns='SKILL',
                           aggfunc='any', fill_value=0).astype(int)

print(df_pivot)

      NUM         
SKILL   A  B  C  E
ID                
1       1  1  0  0
2       0  0  1  0
3       0  0  1  1

对于aggfunc=len +转换为int来说,同样的方法也可以,但是这可能会更昂贵。

答案 2 :(得分:1)

您可以将get_dummiesset_index一起用于指标列,然后获得每个索引的max值:

df = pd.get_dummies(df.set_index('ID')['SKILL']).max(level=0)

为了获得更好的性能,请用drop_duplicates删除重复项,并用set_indexunstack重塑形状:

df = df.drop_duplicates(['ID','SKILL']).set_index(['ID','SKILL'])['NUM'].unstack(fill_value=0)

使用pivot解决方案,但有必要将NaN s替换为0

df = df.drop_duplicates(['ID','SKILL']).pivot('ID','SKILL','NUM').fillna(0).astype(int)

如果要使用您的解决方案,只需删除重复项即可,但最好使用unstack,因为永远不会汇总数据,因为不会将IDSKILL重复成对:

df2 = df.drop_duplicates(['ID','SKILL'])
df_pivot = (df2.pivot_table(index='ID', 
                            columns='SKILL', 
                            values='NUM',
                            aggfunc=len, 
                            fill_value=0))
print (df_pivot)
SKILL  A  B  C  E
ID               
1      1  1  0  0
2      0  0  1  0
3      0  0  1  1