【问题标题】:How to insert a row in a Pandas multiindex dataframe?如何在 Pandas 多索引数据框中插入一行?
【发布时间】:2015-06-12 19:37:33
【问题描述】:

我有一个带有多索引(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

【问题讨论】:

    标签: pandas multi-index


    【解决方案1】:

    您是否考虑过只添加相关行?由于您实际上只是添加一个值的单元格,因此您可以像这样有效地做到这一点:

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

    【讨论】:

    • 我已经使用 pandas 快 5 年了。我不敢相信这是我第一次遇到这种需求,并且刚刚从您的评论中听说.at()。谢谢!
    【解决方案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 方法...
    • 谢谢安迪!我对上述问题有一个轻微的变体 - 对于我正在做的一些特殊处理,我一次处理这些记录一行。所以一次有一个 (Reg, Type, Part, IsExpired) 元组。所以对于有问题的行,我最终得到 - [EMEA Disk A False 22] 我不能使用 unstack/stack 方法。有没有办法在这里为 True 插入一行?
    • @VivekSharma 如果您正在处理一次...我认为您应该分批执行此操作(等到您有很多,然后使用熊猫)。或者只是使用 python,也许像 collections.deque 这样的东西。还是我误会你了?为什么你必须一次处理一个?
    • @VivekSharma (另外,一次创建一行数据帧不能很好地扩展它在时间/内存上是 O(n^2)。
    • 在我的问题描述中,我留下了一级索引,我必须在其中填充一些丢失的数据,但在一个(Reg、Type、Part、IsExpired)的上下文中。所以它一次处理一堆行。但是,我使用您的建议来填充 IsExpired 值之前我创建了多级索引,它工作得很好!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-06-24
    • 2020-10-30
    • 2017-08-19
    • 2020-10-22
    • 2021-05-11
    • 2018-12-01
    • 1970-01-01
    相关资源
    最近更新 更多