我有一个约300列的数据框,其列从'Prod1'到'Prod300',如下所示:
ID Product Prod1 Prod2 Prod3 Prod4 Prod5 Prod6 Prod7
01 1 0 0 0 0 0 0 0
01 2 0 0 0 0 0 0 0
01 3 0 0 0 0 0 0 0
02 1 0 0 0 0 0 0 0
02 4 0 0 0 0 0 0 0
03 3 0 0 0 0 0 0 0
04 6 0 0 0 0 0 0 0
我想要的是根据“产品”列中的值简单地填充相应的“产品”列,即下面的df作为输出-
ID Product Prod1 Prod2 Prod3 Prod4 Prod5 Prod6 Prod7
01 1 1 0 0 0 0 0 0
01 2 0 1 0 0 0 0 0
01 3 0 0 1 0 0 0 0
02 1 1 0 0 0 0 0 0
02 4 0 0 0 1 0 0 0
03 3 0 0 1 0 0 0 0
04 6 0 0 0 0 0 1 0
问题是,我知道我总共只有300种产品,但是我可能无法获得“产品”列中的所有值,即使'Prod7'列中不存在,我也想保留它产品”列,并且所有值= 0。 所以,我不能使用pivot_table ...
我尝试遍历“产品”列,如下所示:
for row in range ( len( df['Product'])) :
df['Prod' + str( df['Product'][row] ) ][row] = 1
我在上面做的事情是依次遍历“产品”列中的值,然后在相应的列和同一行中填充1。
此外,由于从Prod1到Prod300有300列,所以我不想像下面这样逐列进行操作:
df['Prod1'] = np.where(df['Product'] == 1, 1 , 0)
df['Prod2'] = np.where(df['Product'] == 2, 1 , 0)
df['Prod3'] = np.where(df['Product'] == 3, 1 , 0)
........
........
现在上面的代码有效,但是我知道您不应该将其用于循环,因为它们很慢。
也许是因为我是python的新手,它的确很简单,但是任何替代方法都将不胜感激。我还担心代码的运行时,因此比以前快的任何事情都会很有帮助...
答案 0 :(得分:2)
此处不需要空列。
将get_dummies
用于新的指标列,将DataFrame.reindex
添加到range
和最后DataFrame.add_prefix
的不存在列中:
df1 = (pd.get_dummies(df['Product'])
.reindex(range(1, 8), axis=1, fill_value=0)
.add_prefix('Prod'))
print (df1)
Prod1 Prod2 Prod3 Prod4 Prod5 Prod6 Prod7
0 1 0 0 0 0 0 0
1 0 1 0 0 0 0 0
2 0 0 1 0 0 0 0
3 1 0 0 0 0 0 0
4 0 0 0 1 0 0 0
5 0 0 1 0 0 0 0
6 0 0 0 0 0 1 0
然后可以将DataFrame.join
与原始DataFrame
的前两列一起使用:
df2 = df.iloc[:, :2].join(df1)
print (df2)
ID Product Prod1 Prod2 Prod3 Prod4 Prod5 Prod6 Prod7
0 1 1 1 0 0 0 0 0 0
1 1 2 0 1 0 0 0 0 0
2 1 3 0 0 1 0 0 0 0
3 2 1 1 0 0 0 0 0 0
4 2 4 0 0 0 1 0 0 0
5 3 3 0 0 1 0 0 0 0
6 4 6 0 0 0 0 0 1 0
答案 1 :(得分:0)
您可以做到:
df.iloc[range(df.shape[0]),df['Product']] = 1
如果ID
是列而不是索引,则可以:
df.iloc[range(df.shape[0]),df['Product']+1] = 1
例如:
df = pd.DataFrame({'Product':[1, 3, 2, 3,4]})
df['prod1'] = df['prod2'] = df['prod3'] = df['prod4'] = 0
df.iloc[range(df.shape[0]),df['Product']] = 1
df
>>
Product prod1 prod2 prod3 prod4
0 1 1 0 0 0
1 3 0 0 1 0
2 2 0 1 0 0
3 3 0 0 1 0
4 4 0 0 0 1