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
我想要的是根据“产品”列中的值简单地填充相应的“产品”列,即下面的 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 新手,它真的很简单,但任何替代方案都会非常感激。我也担心代码的运行时,所以任何比以前更快的东西都会非常有帮助......
解决方案
此处不需要空列。
用于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
推荐阅读
- c# - Unity 的 OPC UA 客户端
- node.js - Multer.Multer 中间件没有响应/工作
- c# - 显示自定义错误页面而不是我的图像
- android-studio - 如何在 android studio 中将 .aar 文件添加到 gradle.kts?
- azure-ad-b2c - 有没有办法在 AD B2C 自定义策略中显示验证错误摘要
- awk - 如何在 bash 中使用 sed/awk 将字符串从模式剪切到模式
- java - 使用专用链接的 Azure Cosmos DB 连接问题
- php - 监听 Laravel 迁移事件
- session - 在 Oracle APEX 19.2 中禁用每个用户的多个会话
- java - 如何在@scheduled spring boot 中给出固定延迟和初始延迟分钟?