【问题标题】:Most elegant way to transform this type of table?最优雅的方式来改造这种类型的桌子?
【发布时间】:2021-10-19 15:25:37
【问题描述】:

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

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。

【问题讨论】:

  • 看看 stackoverflow 上的其他答案:stackoverflow.com/a/26640715/3087542
  • 谢谢,@quizzical_panini,链接线程是一个更简单的问题,因为它只是从宽转换为长。我正在寻找使用数字命名列并将它们推入一个用于每种唯一类型的变量。

标签: python pandas dataframe


【解决方案1】:

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

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

【讨论】:

  • 如何处理多个属性(超过 2 个)?
  • 用for i in range(1, n) 替换for i in [1, 2](我相应地编辑了我的答案)。
猜你喜欢
  • 2021-11-15
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多