【问题标题】:Adding a value at the end of a column in a multindex column dataframe在多索引列数据框中的列末尾添加值
【发布时间】:2021-11-17 12:34:16
【问题描述】:

我有一个简单的问题,可能有一个简单的解决方案,但我在任何地方都找不到。我有以下多索引列数据框:

mux = pd.MultiIndex.from_product(['A','B','C'], ['Datetime', 'Str', 'Ret']])
dfr = pd.DataFrame(columns=mux)

  |      A         |        B       |        C       |
  |Datetime|Str|Ret|Datetime|Str|Ret|Datetime|Str|Ret|

我需要在特定子列的末尾一一添加值。例如,在 A 列子列 Datetime 的末尾添加一个值并保持该行的其余部分不变,然后将另一个值添加到 B 列子列 Str 并再次保持同一行中的其余值不变等等。所以我的问题是:是否可以在这种类型的数据框中定位单个位置?如何?并且是否可以在不知道结束位置的情况下始终在前一个值之后的末尾附加一个单独的值而不是整行?非常感谢您的回答。

【问题讨论】:

    标签: python pandas dataframe append


    【解决方案1】:

    IIUC,你可以使用.loc

    idx = len(dfr)  # get the index of the next row after the last one
    dfr.loc[idx, ('A', 'Datetime')] = pd.to_datetime('2021-09-24')
    dfr.loc[idx, ('B', 'Str')] = 'Hello'
    dfr.loc[idx, ('C', 'Ret')] = 4.3
    

    输出:

    >>> dfr
                         A                  B                    C          
                  Datetime  Str  Ret Datetime    Str  Ret Datetime  Str  Ret
    0  2021-09-24 00:00:00  NaN  NaN      NaN  Hello  NaN      NaN  NaN  4.3
    

    更新

    我的意思是,例如,当我在不同列中有不同数量的值时(例如,A-Str 列中有 6 个值,但 B-Datetime 列中只有 4 个)但我真的不知道。在这种情况下,我需要在最后一个值之后添加该列中的下一个值,因此我需要知道该特定列的最后一个非 Nan 值的索引,以便我可以在您的答案中使用它,因为如果我使用 len( dfr) 在尝试向只有 4 个值的列添加值时,它最终会出现在第 7 行而不是第 5 行,这是因为其中一列的值可能比其他列多。

    您可以使用last_valid_index 轻松完成。创建一个方便的函数append_to_col 在数据框中就地附加值:

    def append_to_col(col, val):
        idx = dfr[col].last_valid_index()
        dfr.loc[idx+1 if idx is not None else 0, col] = val
    
    
    # Fill your dataframe
    append_to_col(('A', 'Datetime'), '2021-09-24')
    append_to_col(('A', 'Datetime'), '2021-09-25')
    append_to_col(('B', 'Str'), 'Hello')
    append_to_col(('C', 'Ret'), 4.3)
    append_to_col(('C', 'Ret'), 8.2)
    append_to_col(('A', 'Datetime'), '2021-09-26')
    

    输出:

    >>> dfr
                A                  B                    C          
         Datetime  Str  Ret Datetime    Str  Ret Datetime  Str  Ret
    0  2021-09-24  NaN  NaN      NaN  Hello  NaN      NaN  NaN  4.3
    1  2021-09-25  NaN  NaN      NaN    NaN  NaN      NaN  NaN  8.2
    2  2021-09-26  NaN  NaN      NaN    NaN  NaN      NaN  NaN  NaN
    

    【讨论】:

    • 谢谢您的回答,这很有帮助,但是我也希望将值添加到该特定列的第一个可用位置,例如在添加 DateTime 值之后,如何添加在保持 DateTime 值的同时对第一行而不是第二行说“你好”?也许解决方案是删除所有 Nan 并将值移动到第一个可用位置,但我不知道该怎么做。
    • 谢谢,这就是我要找的答案。现在每次我需要添加一个新值时,我都可以通过查看我想要添加值的列的最后一个非 Nan 的行 idx 来简单地定义 idx,我会用谷歌搜索这个。
    • 我的意思是,例如,当我在不同列中有不同数量的值时(例如,A-Str 列中有 6 个值,但 B-Datetime 列中只有 4 个)但我真的不知道。在这种情况下,我需要在最后一个值之后添加该列中的下一个值,因此我需要知道该特定列的最后一个非 Nan 值的索引,以便我可以在您的答案中使用它,因为如果我使用 len( dfr) 在尝试向只有 4 个值的列添加值时,它最终会出现在第 7 行而不是第 5 行,这是因为其中一列的值可能比其他列多。
    • 好的。我明白了。我会更新一个答案。我认为last_valid_index 并没有那么复杂。我赞成你的问题。
    • 我更新了我的答案。我想这就是你要找的。​​span>
    猜你喜欢
    • 1970-01-01
    • 2018-10-17
    • 2020-03-12
    • 2018-07-27
    • 2020-10-14
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 2021-10-30
    相关资源
    最近更新 更多