首页 > 解决方案 > 根据一列中存在的列名填充数据框中的其他列

问题描述

我有一个大约 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 个产品,但我可能无法获得“产品”列中的所有值,并且我也想保留“产品 7”列,即使它不存在于“产品”列中并且所有值= 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)
........
........

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

也许是因为我是 python 新手,它真的很简单,但任何替代方案都会非常感激。我也担心代码的运行时,所以任何比以前更快的东西都会非常有帮助......

标签: pythonpandasloops

解决方案


此处不需要空列。

用于get_dummies新的指标列,添加DataFrame.reindex用于添加不存在的列 byrange和 last 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与 original 的前 2 列一起使用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

推荐阅读