python - 将分类值转换为 Pandas 中的列
问题描述
我需要将分类行转换为单独的列,同时将主键保留在数据中。
在数据中,所有有用的属性都存在于 2 列中(attribute_name 和 attribute_value)。我想将 attribute_name 中的行转换为单独的列,并使用 attribute_value 列中的相应数据填充它们(如下图所示)。
注意:并非所有 part_id 都具有相同的属性名称或已填充它们。转换后,一些 part_id 将在新列中缺少值。
我尝试了 pandas unstack() 和 pivot() 函数,但它们也将 platform_id 和 part_id 值转换为列。
下面的代码最接近我的要求,但它为每个 part_id 创建了重复的列,我无法在保留我的主键(如 platform_id 和 part_id)的同时进行此转换:
df[['attribute_name', attribute_value']].set_index('attribute_name').T.rename_axis(None axis=1).reset_index(drop=True)
添加代码以重新创建数据框:
data = {'Platform_id':[4356, 4356, 4356, 23675, 23675, 23675, 772, 772],\
'part_id':['XCVT43', 'XCVT43', 'XCVT43', 'TT3344', 'TT3344', 'TT3344', 'GHTYW2', 'GHTYW2'], \
'class_id':['PROCESSOR', 'PROCESSOR','PROCESSOR','PROCESSOR','PROCESSOR','PROCESSOR','PROCESSOR','PROCESSOR',], \
'attribute_name': ['Vendor_name', 'Cache', 'Clock-speed', 'Vendor_name', 'Model_name', 'Clock-speed', 'Vendor_name', 'Cache'], \
'attribute_value': ['Intel', '4', '3.1', 'Intel', '4500U', '2.3', None, '4']}
df = pd.DataFrame(data)
解决方案
您可以使用:
vendors=df['attribute_name'].unique()
df2=pd.concat([df.set_index(['Platform_id','part_id','class_id']).groupby('attribute_name')['attribute_value'].get_group(key) for key in vendors],axis=1)
df2.columns=vendors
df2.reset_index(inplace=True)
print(df2)
Platform_id part_id class_id Vendor_name Cache Clock-speed Model_name
0 772 GHTYW2 PROCESSOR None 4 NaN NaN
1 4356 XCVT43 PROCESSOR Intel 4 3.1 NaN
2 23675 TT3344 PROCESSOR Intel NaN 2.3 4500U
推荐阅读
- r - 在循环中使用 TmParallelApply 创建变量
- bash - 大量文件被logrotate错误重命名,压缩了n次。正确重命名它们
- python - 正则表达式模式以匹配字母表以及用户指定的特殊字符列表
- java - 在运行时使用 testngListners 为 @test 方法设置注释
- c# - 在不知道 partitionkey 时使用 DocumentClient.ReadDocumentAsync
- python - python pandas - 使用 astype() 处理字符串中的逗号到浮点转换的通用方法
- python-3.x - 'in' & '==' 运算符在 Python3 中不带括号的表达式中一起使用时会产生意外的输出
- r - 无法在 r 中的树中读取
- flutter - 页面更改后 Flutter Isolate ReceiverPort 未侦听
- javascript - npm 相关任务在安装过程中抛出错误