如何使用Pandas获取数据透视表中行标题的行号?

时间:2019-08-02 16:38:40

标签: python pandas

我在熊猫中有一个数据透视表,如下所示:

enter image description here

如何获取A列中类别的行号?

这是我构造数据透视表的方法:

labor_table_rank = pd.pivot_table(labor_data, margins='True', values='Labor Cost', index=['Rank', 'Employee'], columns=['Date'], aggfunc=np.sum)

1 个答案:

答案 0 :(得分:1)

我创建了以下测试DataFrame( labor_data ):

         Rank Employee     Date  Labor Cost
0  Category 1    Sub 1  2019-01       200.0
1  Category 1    Sub 1  2019-02        21.0
2  Category 1    Sub 2  2019-01       210.0
3  Category 1    Sub 2  2019-02        11.0
4  Category 1    Sub 3  2019-01       220.0
5  Category 2    Sub 4  2019-01       230.0
6  Category 2    Sub 5  2019-01       240.0
7  Category 2    Sub 6  2019-01       250.0
8  Category 2    Sub 6  2019-02         7.1
从上述DataFrame生成的

数据透视表( labor_table_rank )是:

Date                 2019-01  2019-02     All
Rank       Employee                          
Category 1 Sub 1       200.0     21.0   221.0
           Sub 2       210.0     11.0   221.0
           Sub 3       220.0      NaN   220.0
Category 2 Sub 4       230.0      NaN   230.0
           Sub 5       240.0      NaN   240.0
           Sub 6       250.0      7.1   257.1
All                   1350.0     39.1  1389.1

由于 Excel 使此表与 Pandas 略有不同, 让我们从校正图片开始:

类别1 不会占用自己的行,但它是

在具有此排名的第一行中,第一个MultiIndex级别,在本例中为 0 行(假设行号从 0 开始)。

与具有类别2 的行相同。

在上表中,具有非空类别的行(排名列) 是 0 行和 3 行。

请注意,第 6 行也有非空的 Rank 列,但这只是 边距行,而不是类别,因此不应将其包含在行号列表中。因此, Juan 在他的评论中表达的主张“太宽泛”。

要获取行号列表,请按以下步骤操作:

生成一个“阴影”数据框( df ),并将索引重置为连续 数字(从 0 开始),它们也是行号:

df = labor_table_rank.reset_index()

结果是:

Date        Rank Employee  2019-01  2019-02     All
0     Category 1    Sub 1    200.0     21.0   221.0
1     Category 1    Sub 2    210.0     11.0   221.0
2     Category 1    Sub 3    220.0      NaN   220.0
3     Category 2    Sub 4    230.0      NaN   230.0
4     Category 2    Sub 5    240.0      NaN   240.0
5     Category 2    Sub 6    250.0      7.1   257.1
6            All            1350.0     39.1  1389.1

请注意,标题行中的 Data 名称是索引的名称 并且与下面的 row 索引没有共同点(没有名称)。

然后,要获取所需的行号,请运行:

df.index[df.Rank.ne(df.Rank.shift()) & df.Rank.ne('All')].to_list()

结果是:

[0, 3]

应有尽有。

相关问题
最新问题