如何在第二级具有可变长度的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.last
或GroupBy.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 [重复]
如何在 TensorFlow 中处理具有可变长度序列的批次?
如何更新 MultiIndex pandas DataFrame 的子集