如何在第二级具有可变长度的MultiIndex DataFrame中获取第二级的所有最后一行

Posted

技术标签:

【中文标题】如何在第二级具有可变长度的MultiIndex DataFrame中获取第二级的所有最后一行【英文标题】:How to get all last rows at second level in MultiIndex DataFrame whose second level has variable length 【发布时间】:2021-10-20 02:32:43 【问题描述】:

我有这个数据框:

df = pd.DataFrame(
    'thread_id': [0,0,1,1,1,2,2],
    'message_id_in_thread': [0,1,0,1,2,0,1],
    'text': ['txt0', 'txt1', 'txt2', 'txt3', 'txt4', 'txt5', 'txt6']
).set_index(['thread_id', 'message_id_in_thread'])

我想保留所有最后的第二级行,这意味着:

对于thread_id==0,我想保留行message_id_in_thread==1 对于thread_id==1,我想保留行message_id_in_thread==2 对于thread_id==2,我想保留行message_id_in_thread==1

这可以通过df.iterrows()轻松实现,但我想知道是否有任何直接索引方法。

我寻找类似df.loc[(:, -1)] 的东西,它从所有 (:) 级别 1 组中选择该块/组的最后 (-1) 行,但显然这不起作用。

【问题讨论】:

嗯。看起来你可以在 thread_id 上分组并选择最后一行 .last 【参考方案1】:

如果需要两个级别都使用GroupBy.tail:

df = df.groupby(level=0).tail(1)
print (df)
                                text
thread_id message_id_in_thread      
0         1                     txt1
1         2                     txt4
2         1                     txt6

如果只需要第一级,请使用GroupBy.lastGroupBy.nth

df = df.groupby(level=0).last()
#df = df.groupby(level=0).nth(-1)
print (df)
           text
thread_id      
0          txt1
1          txt4
2          txt6

【讨论】:

以上是关于如何在第二级具有可变长度的MultiIndex DataFrame中获取第二级的所有最后一行的主要内容,如果未能解决你的问题,请参考以下文章

如何将可变长度列表的 Pandas DataFrame 列(或系列)转换为固定宽度的 DataFrame [重复]

MultiIndex / 高级索引,其中级别不是(!=)值

如何在 TensorFlow 中处理具有可变长度序列的批次?

如何更新 MultiIndex pandas DataFrame 的子集

不同长度的pandas groupby元组-ValueError:在通过级别中找不到值:MultiIndex

如何生成具有可变长度的随机字符串