Pandas 使用列作为后缀进行透视

Jac*_*ack 2 python pandas pyspark

我有一个类似于以下示例的数据框:

ID 类型 值_1 值_2
1234 A 1 2
1234 1 2
第789章 A 1 2
第789章 1 2
第567章 A 1 2

我想转换以获得以下内容:

ID 值_1_A 值_1_B 值_2_A 值_2_B
1234 1 1 2 2
第789章 1 1 2 2
第567章 1 1

总之:使用“类型”列作为后缀复制值列并将数据帧转换为宽格式。

有没有任何干净、简单的方法可以在 pyspark 数据框或 pandas 上执行此操作?

Hen*_*ker 5

然后,pandas我们将pivot使用以下命令折叠多索引Index.map

new_df = df.pivot(index='Id', columns='Type')
new_df.columns = new_df.columns.map('_'.join)
# Or with an explicit format string like:
# new_df.columns = new_df.columns.map('{0[0]}_{0[1]}'.format)
new_df = new_df.reset_index()
Run Code Online (Sandbox Code Playgroud)

new_df

     Id  Value_1_A  Value_1_B  Value_2_A  Value_2_B
0   567        1.0        NaN        2.0        NaN
1   789        1.0        1.0        2.0        2.0
2  1234        1.0        1.0        2.0        2.0
Run Code Online (Sandbox Code Playgroud)

数据框和导入:

import pandas as pd

df = pd.DataFrame({'Id': {0: 1234, 1: 1234, 2: 789, 3: 789, 4: 567},
                   'Type': {0: 'A', 1: 'B', 2: 'A', 3: 'B', 4: 'A'},
                   'Value_1': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1},
                   'Value_2': {0: 2, 1: 2, 2: 2, 3: 2, 4: 2}})
Run Code Online (Sandbox Code Playgroud)

  • `df.columns.map('_'.join')` 工作正常;除非我错过了某事 (2认同)
  • 不,你是100%正确的@sammywemmy,这个问题有点开放式,所以我正在尝试构建一个尽可能灵活的解决方案。 (2认同)