如何在Pandas多级索引数据框中插入一行?

4

我有一个带有多级索引(Reg,Type,Part,IsExpired)的Pandas数据框。

Reg        Type      Part     IsExpired    Quantity
APAC       Disk      A        False        10
                              True         12
EMEA       Disk      A        False        22
EMEA       Disk      B        False        13
                              True         17

我希望每个(Reg,Type,Part)元组都有对于IsExpired的True和False。例如,我想为(EMEA,Disk,A,True)插入一行 -

Reg        Type      Part     IsExpired    Quantity
APAC       Disk      A        False        10
                              True         12
EMEA       Disk      A        False        22
                              True         0   <-- inserted row
EMEA       Disk      B        False        13
                              True         17
2个回答

3

您是否考虑过直接添加相关行呢?因为您只需要添加一个值,所以可以通过以下方式高效地实现:

df.at[('EMEA', 'DISC', 'A', False), 'Quantity'] = 0 

我已经使用pandas将近5年了。我简直不敢相信这是我第一次遇到这种需求,而且是从你的评论中才听说.at()。谢谢! - Shadi

2
你可以使用unstack函数,然后再使用fillna函数:
In [11]: df2
Out[11]:
                          Quantity
Reg  Type Part IsExpired
APAC Disk A    False            10
               True             12
EMEA Disk A    False            22
          B    False            13
               True             17

In [12]: df2.unstack()
Out[12]:
               Quantity
IsExpired         False True
Reg  Type Part
APAC Disk A          10    12
EMEA Disk A          22   NaN
          B          13    17

In [13]: df2.unstack().fillna(0)
Out[13]:
               Quantity
IsExpired         False True
Reg  Type Part
APAC Disk A          10    12
EMEA Disk A          22     0
          B          13    17

也许将此保留为一列是有意义的?否则,可以使用stack将其转换回去:
In [14]: df2.unstack().fillna(0).stack()
Out[14]:
                          Quantity
Reg  Type Part IsExpired
APAC Disk A    False            10
               True             12
EMEA Disk A    False            22
               True              0
          B    False            13
               True             17

注意:在执行堆栈/取消堆栈操作时,通常有一种替代的“pivot”/“pivot_table”方法... - Andy Hayden
谢谢Andy!我有一个稍微不同的问题 - 对于我正在进行的一些特殊处理,我是逐行处理这些记录的。因此,每次处理一个元组(Reg,Type,Part,IsExpired)。所以对于所讨论的行,我最终得到 - [EMEA Disk A False 22],其中我无法使用unstack / stack方法。是否有一种方法可以在此处插入True的行? - Vivek Sharma
@VivekSharma 如果您只需要处理一次……我认为您应将其分批处理(等有很多数据时再使用 pandas)。或者只需使用 Python,也许可以使用collections.deque之类的东西。还是我误解了您的意思?为什么您必须一次处理一个呢? - Andy Hayden
@VivekSharma(此外,逐行创建数据框不具有良好的可扩展性,时间/内存复杂度为O(n^2)。) - Andy Hayden
在我的问题描述中,我忽略了一个索引级别,在这个级别中,我需要填充一些缺失的数据,但是在一个(Reg、Type、Part、IsExpired)的上下文中。因此,它一次处理一堆行。然而,在创建多级索引之前,我使用了您的建议来填充IsExpired值,并且它完美地工作了!谢谢! - Vivek Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接