如何筛选Pandas多索引DataFrame中仅含1条记录的元素
解决多索引分组后筛选仅含1条记录的组
没问题,我来帮你搞定这个需求!首先先重现一下你的DataFrame,方便后续演示:
import pandas as pd df = pd.DataFrame([[1, 1, 2, 2, 2, 3,4,5,5,5,6,6,6,6], list('AABBBCDEEEFFFF'), [1, 2, 3, 4, 5, 6,7,8,9,10,11,12,13,14], [1, 2, 3, 4, 5, 6,7,8,9,11,12,11,11,11]]).T df.columns = ['col1','col2','col3','col4']
接下来我会给出几种实用的方法,帮你筛选出分组后仅包含1条记录的元素:
方法一:使用groupby.filter()(最简洁)
filter方法可以直接对每个分组应用判断条件,保留符合条件的组的所有行。这里我们判断每个组的长度是否为1:
# 按col1和col2分组,筛选组内仅1条记录的行 filtered_df = df.groupby(['col1', 'col2']).filter(lambda x: len(x) == 1)
运行后得到的filtered_df就是仅包含(col1=3, col2=C)和(col1=4, col2=D)这两个组的行,这两个组正好各只有1条记录。
方法二:先计算组大小再筛选
如果你想直观看到每个组的大小,可以先通过transform把组大小添加到原DataFrame,再筛选:
# 给每行添加对应组的大小 df['group_size'] = df.groupby(['col1', 'col2'])['col1'].transform('size') # 筛选组大小为1的行,最后删掉临时列 filtered_df = df[df['group_size'] == 1].drop('group_size', axis=1)
这种方法的好处是你可以先查看所有组的大小,再做筛选,适合需要额外确认分组情况的场景。
方法三:通过多索引直接定位
如果你想先获取那些仅含1条记录的组的索引,再用索引筛选原DataFrame,可以这么做:
# 计算每个分组的大小 group_sizes = df.groupby(['col1', 'col2']).size() # 筛选出大小为1的组的多索引 single_row_groups = group_sizes[group_sizes == 1].index # 用这些索引筛选原DataFrame,最后重置索引 filtered_df = df.set_index(['col1', 'col2']).loc[single_row_groups].reset_index()
这种方法更灵活,如果你需要单独处理这些组的索引,这个方案会很合适。
内容的提问来源于stack exchange,提问作者gabboshow
相关产品推荐
相关产品推荐

