基于一列中的列名填充dataframe中的其他列

2024-10-03 17:23:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个约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

我只想根据“Product”列中的值填充相应的“Prod”列,即下面的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个产品,但我可能无法获得“Product”列中的所有值,我也想保留“Prod7”列,即使它不在“Product”列中并且所有值都为0。 所以,我不能用透视表。。。你知道吗

我试过循环浏览“产品”栏,如下所示:

for row in range ( len( df['Product'])) :
   df['Prod' + str( df['Product'][row] ) ][row] = 1

我在上面所做的是逐个检查“Product”列中的值,然后在相应的列和同一行中填充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)
........
........

现在上面的代码可以工作了,但是我知道你不应该使用for循环,因为它们很慢。你知道吗

可能是因为我对python还不熟悉,而且它非常简单,但是任何其他的选择都会非常感激。我也很关心代码的运行时间,所以任何比以前快的东西都会非常有帮助。。。你知道吗


Tags: iddfnpprodproductwhererowprod3
2条回答

此处不需要空列。你知道吗

对于新的指示符列使用^{},对于通过range和最后一个^{}添加不存在的列,使用^{}

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的前2列一起使用:

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

你可以做:

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

相关问题 更多 >