转换这种类型的表的最优雅的方式?



我有一个数据框架,看起来像这样:

id   name   last   attribute_1_name  attribute_1_rating  attribute_2_name  attribute_2_rating
1   Linda  Smith  Age                23                  Hair              Brown
3   Brian  Lin    Hair               Black               Job               Barista

基本上我想把这个表变成这样:

id   name   last   attribute_name  attribute_rating
1   Linda  Smith  Age                23
1   Linda  Smith  Hair               Brown
3   Brian  Lin    Hair               Black
3   Brian  Lin    Job                Barista

在Python中执行这种转换的最优雅、最有效的方法是什么?假设有更多的行,属性号增加到13。

假设属性列的命名是一致的,您可以这样做:

result = pd.DataFrame()
# n is the number of attribute columns
for i in range(1, n):
attribute_name_col = f'attribute_{i}_name'
attribute_rating_col = f'attribute_{i}_rating'
melted = pd.melt(
df, 
id_vars=['id', 'name', 'last', attribute_name_col], 
value_vars=[attribute_rating_col]
)
melted = melted.rename(
columns={attribute_name_col: 'attribute_name', 
'value': 'attribute_rating'}
)
melted = melted.drop('variable', axis=1)
result = pd.concat([result, melted])

,其中df是原始数据帧。然后打印result得到

id  name    last      attribute_name    attribute_rating
1   Linda   Smith     Age               23
3   Brian   Lin       Hair              Black
1   Linda   Smith     Hair              Brown
3   Brian   Lin       Job               Barista

最新更新