如何在Pandas中重塑或透视DataFrame

2 投票
1 回答
2963 浏览
提问于 2025-04-18 10:41

我想在Pandas中重新调整一个数据表的形状,但不太确定该怎么做。以下是我现在的表格:

Phase Weight Value  CF
AA   heavy    0.28  1.0
AB   light    3.26  1.0
BX   med      0.77  1.0
XY   x light -0.01  1.0
AA   heavy    0.49  1.5
AB   light    5.10  1.5
BX   med      2.16  1.5
XY   x light  0.98  1.5
AA   heavy    2.48  2.0
AB   light   11.70  2.0
BX   med      5.81  2.0
XY   x light  3.46  2.0

我想调整成这样的格式:

Phase       Weight  1.0     1.5     2.0
AA          heavy   0.28    0.49    2.48
AB          light   3.26    5.10    11.70
BX          med     0.77    2.16    5.81
XY        x light  -0.01    0.98    3.46

在新的表格中,列名变成了原来CF列中的值,而行和列交叉的地方则是原表中值列的值。

我知道可以用Phase列作为索引来实现,像这样:

df.pivot(index='Phase', columns='CF', values='Value)

但这样我就会丢失weight列。我尝试过这样做,但出现了错误:

df.pivot(index='Phase', columns=['Weight','CF'], values='Value')

有没有办法用一个简单的语句来完成这个?如果不行,最好的方法是什么呢?

1 个回答

4

你可以使用 pd.pivot_table,这个函数可以接受多个名称作为索引或列的参数。我觉得你可能想把“Weight”放在索引上(这样它在输出中就会变成一列),而不是放在列上(那样不同的值就会变成列)。

In [27]: df.pivot_table(index=['Phase','Weight'], columns='CF', values='Value').reset_index()
Out[27]: 
CF Phase   Weight   1.0   1.5    2.0
0     AA    heavy  0.28  0.49   2.48
1     AB    light  3.26  5.10  11.70
2     BX      med  0.77  2.16   5.81
3     XY  x light -0.01  0.98   3.46

编辑:

在你提到的另一个问题中,DataFrame 的 .columns 是一个索引(就像行一样),它除了实际的值之外,还有一个 .name。据我所知,这个名字一般是用来显示的。

In [74]: df.columns
Out[74]: Index([u'Phase', u'Weight', 1.0, 1.5, 2.0], dtype='object')

In [75]: df.columns.name
Out[75]: 'CF'

In [76]: df.columns.values
Out[76]: array(['Phase', 'Weight', 1.0, 1.5, 2.0], dtype=object)

撰写回答