我在熊猫中有一个数据透视表,如下所示:
如何获取A列中类别的行号?
这是我构造数据透视表的方法:
labor_table_rank = pd.pivot_table(labor_data, margins='True', values='Labor Cost', index=['Rank', 'Employee'], columns=['Date'], aggfunc=np.sum)
答案 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 不会占用自己的行,但它是
与具有类别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]
应有尽有。