如何移除Pandas DataFrame中存在符合条件行的年份层级及所有行?
解决方法:移除包含至少一行temp<37的整个年份数据
我明白你的需求了——你现在需要的不是删除某一行,而是只要某个年份里存在任意一行temp小于37,就把这个年份的所有记录都移除。我来给你一步步解决这个问题:
1. 先构造完整的测试数据(方便演示)
你提供的代码片段不完整,我先补全测试数据,这样能更直观看到效果:
import pandas as pd # 构造多级索引的DataFrame index = pd.MultiIndex.from_product([[2013, 2014], [1, 2]], names=['yr', 'visit']) data = pd.DataFrame( [[96, 38], [98, 39], [100, 36], [97, 37.5]], index=index, columns=['hr', 'temp'] )
此时原数据是:
hr temp yr visit 2013 1 96 38.0 2 98 39.0 2014 1 100 36.0 2 97 37.5
2. 方法一:用groupby.filter()直接过滤年份组
这是最简洁的方式,filter方法会自动保留满足条件的整个组(年份)的所有行:
# 保留所有年份中,所有temp都≥37的行(即排除有至少一行temp<37的年份) filtered_data = data.groupby('yr').filter(lambda x: x['temp'].min() >= 37)
代码解释:
groupby('yr'):按年份分组lambda x: x['temp'].min() >= 37:对每个年份组x,检查该组的temp最小值是否≥37——如果是,说明这个年份没有temp<37的记录,就保留整个组;否则就移除整个组。
3. 方法二:分步筛选有效年份再过滤
如果你想更清晰地看到中间过程,可以分两步操作:
# 第一步:计算每个年份的最小temp值 year_min_temp = data.groupby('yr')['temp'].min() # 第二步:筛选出最小temp≥37的年份(即需要保留的年份) valid_years = year_min_temp[year_min_temp >= 37].index # 第三步:用有效年份过滤原数据 filtered_data = data[data.index.get_level_values('yr').isin(valid_years)]
最终结果
两种方法得到的结果一致,都会移除2014年的所有行,只保留2013年的数据:
hr temp yr visit 2013 1 96 38.0 2 98 39.0
内容的提问来源于stack exchange,提问作者vintagedeek
相关产品推荐
相关产品推荐

