当前位置: 首页 > 知识库问答 >
问题:

将行列的组合转换为列标题

花阳秋
2023-03-14

我有一个数据框如下:

Machine    Time      Part    PowerA    PowerB
1         20:30       1        0.1      0.4
1         20:30       2        0.9      0.7
1         20:31       1        0.3      0.1
1         20:31       2        0.2      0.3
2         20:30       1        0.2      0.5
2         20:31       1        0.8      0.4

我希望它是这样的:

Machine    Time      Part1_PowerA   Part1_PowerB    Part2_PowerA    Part2_PowerB
1         20:30           0.1            0.4            0.9             0.7
1         20:31           0.3            0.1            0.2             0.3
2         20:30           0.2            0.5           -1.0            -1.0
2         20:31           0.8            0.4           -1.0            -1.0

我们的目标是为每个< code>Part和< code>Power创建一列,并填写如下所示的值。每台机器都有不同数量的零件,但最多为8个(这将导致列< code>Part8_PowerA和< code>Part8_PowerB)。当机器没有某个部件时,Part_Power的值用-1填充。

我已经寻找了很长时间的解决方案,包括这个,但是我不能适应我的情况,我实际上改变了列的名称,作为一个行值已经存在的列的组合。

谢谢!

共有3个答案

司空默
2023-03-14

您可以这样做:

df = pd.pivot_table(df, values=['PowerA','PowerB'], index=['Machine', 'Time'], columns='Part')
df.columns = df.columns.to_flat_index()
df.columns = [ 'Part' + str(col[1]) + '_'  + col[0] for col in df.columns]
df.reset_index(inplace=True)
df.fillna(-1,inplace=True)
陈夜洛
2023-03-14

您可以将< code>pivot与字符串格式结合使用,以获得一个相当简洁的解决方案:

out = (
    df.pivot(['Machine', 'Time'], 'Part')
    .fillna(-1)
    .sort_index(level=1, axis=1)
)

out.columns = out.columns.map('Part{0[1]}_{0[0]}'.format)
out = out.reset_index()

print(out)
   Machine   Time  Part1_PowerA  Part1_PowerB  Part2_PowerA  Part2_PowerB
0        1  20:30           0.1           0.4           0.9           0.7
1        1  20:31           0.3           0.1           0.2           0.3
2        2  20:30           0.2           0.5          -1.0          -1.0
3        2  20:31           0.8           0.4          -1.0          -1.0

或者,如果您想要一个方法链接的解决方案,您将需要使用< code >。管道从< code >访问当前列值。set_axis,因此您最终会有一些额外的代码膨胀:

print(
    df.pivot(['Machine', 'Time'], 'Part')
    .fillna(-1)
    .sort_index(level=1, axis=1)
    .pipe(lambda d: 
        d.set_axis(
            d.columns.map('Part{0[1]}_{0[0]}'.format),
            axis='columns'
        )
    )
    .reset_index()
)

   Machine   Time  Part1_PowerA  Part1_PowerB  Part2_PowerA  Part2_PowerB
0        1  20:30           0.1           0.4           0.9           0.7
1        1  20:31           0.3           0.1           0.2           0.3
2        2  20:30           0.2           0.5          -1.0          -1.0
3        2  20:31           0.8           0.4          -1.0          -1.0
尉迟俊能
2023-03-14

让我们做pivot_table然后交换级别

s = df.pivot_table(index= ['Machine','Time'], 
                   columns = df.Part.astype(str).radd('Part'),
                   values=['PowerA','PowerB'],
                   fill_value=-1).swaplevel(1,0, axis=1).sort_index(level=0, axis=1)

s.columns = s.columns.map('_'.join)
s.reset_index(inplace=True)
s
Out[751]: 
   Machine   Time  Part1_PowerA  Part1_PowerB  Part2_PowerA  Part2_PowerB
0        1  20:30           0.1           0.4           0.9           0.7
1        1  20:31           0.3           0.1           0.2           0.3
2        2  20:30           0.2           0.5          -1.0          -1.0
3        2  20:31           0.8           0.4          -1.0          -1.0
 类似资料:
  • 我有一个用户表单上的组合框,我想用一个值列表填充它。 这些值位于一系列列的中间,可以被认为是列标题,因为每个列都在自己的列中。列的列表会随着时间的推移而扩展,每次初始化用户表单时都应该更新。我已经能够从单个列创建列表,也可以从多个列创建列表,但是当我这样做时,值保持在列方向,我无法将它们转置到行列表中。列中的数据如下所示: 我希望组合框列表条目如下所示: 这个用户表单由另一个用户表单初始化,该用户

  • 问题内容: 我有以下数据框: 我要这样 堆叠/堆叠似乎不起作用。 问题答案: 您正在寻找: 以及是否要重新排列列:

  • 我是数据科学的初学者,我正在尝试使用Pandas来旋转此数据框架: 所以它变成这样:(标签应该变成列,文件路径变成行。) “标签”列是一组或一类文件路径。我想把它转换成这样一种方式,它适合这个函数:tf。Keras.preprocessing.image.flow_from_dataframe 提前感谢所有帮助我的人。

  • 我有以下数据帧: 我想这样。 堆叠/卸载似乎不工作。

  • 问题内容: 考虑下面的示例,其中有一个包含人员记录的 Person 表和一个包含链接到人员的可选属性的 PersonAttribute 表: Table: Person Table PersonAttribute 我将如何编写一个查询,使所有具有属性的人都像列一样返回?我需要的结果集是: 因此,从本质上讲,我需要编写一个查询,该查询将获取所有带有所有唯一属性键的人记录,这些键被转换为具有每个人记录

  • 问题内容: 我的表包含以下列: 我想显示如下: 如您所见,我想将列与自定义列名成对显示。这对是列A和B,列C和D以及列C和D。 问题答案: