首页 > 解决方案 > 在多索引列数据框中的列末尾添加值

问题描述

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

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 并再次保持同一行中的其余值不变等等。所以我的问题是:是否可以在这种类型的数据框中定位单个位置?如何?并且是否可以在不知道结束位置的情况下始终在前一个值之后的末尾附加一个单独的值而不是整行?非常感谢您的回答。

标签: pythonpandasdataframeappend

解决方案


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

推荐阅读