使用来自现有数据帧的值的pandas创建具有二进制值列的数据框

时间:2018-02-01 14:28:59

标签: python pandas dataset

我正在尝试使用exisitng数据帧中的二进制(0或1)值创建新数据帧。对于给定数据帧中的每一行,程序应从每个单元格中获取值,并为新数据框中具有相同编号的行的相应列设置1

Structure of the existing dataframe

Structure of the new dataframe

我已尝试执行以下代码段。

for col in products :
    index = 0;
    for item in products.loc[col] :
        products_coded.ix[index, 'prod_' + str(item)] = 1;
        index = index + 1;

适用于较少的行数。但是,任何大型数据集都需要大量时间。什么是获得理想结果的最佳方式。

1 个答案:

答案 0 :(得分:1)

我认为你需要:

  • 第一个get_dummies,其投射值为string s
  • 按列名max
  • 汇总max
  • 正确排序将列转换为int
  • reindex有关排序和追加缺失的列,请将NaN替换为参数0的{​​{1}}并删除第一个fill_value=0
  • add_prefix用于重命名列
0

另一个类似的解决方案:

df = pd.DataFrame({'B':[3,1,12,12,8],
                   'C':[0,6,0,14,0],
                   'D':[0,14,0,0,0]})

print (df)
    B   C   D
0   3   0   0
1   1   6  14
2  12   0   0
3  12  14   0
4   8   0   0

df1 = (pd.get_dummies(df.astype(str), prefix='', prefix_sep='')
         .max(level=0, axis=1)
         .rename(columns=lambda x: int(x))
         .reindex(columns=range(1, df.values.max() + 1), fill_value=0)
         .add_prefix('prod_'))
print (df1)

   prod_1  prod_2  prod_3  prod_4  prod_5  prod_6  prod_7  prod_8  prod_9  \
0       0       0       1       0       0       0       0       0       0   
1       1       0       0       0       0       1       0       0       0   
2       0       0       0       0       0       0       0       0       0   
3       0       0       0       0       0       0       0       0       0   
4       0       0       0       0       0       0       0       1       0   

   prod_10  prod_11  prod_12  prod_13  prod_14  
0        0        0        0        0        0  
1        0        0        0        0        1  
2        0        0        1        0        0  
3        0        0        1        0        1  
4        0        0        0        0        0