如何利用不符合中位数条件的列值列表删除对应行?
如何移除DataFrame中指定列计数低于中位数的行?
现有Python函数remove_low_data_states可返回DataFrame指定列中计数低于中位数的值列表(示例返回['hello','bye']),目标是移除这些值对应的行,尝试使用pd.drop方法未达预期,求正确实现方式。
原函数代码:
def remove_low_data_states(column_name): items = df[column_name].value_counts().reset_index() items.columns = ['place', 'value'] print(f'Items in column: [{column_name}] with low data') return list(items[items['value'].apply(lambda val: val < items.value.median())].place) # 调用示例 remove_low_data_states('col1') # 返回 ['hello', 'bye']
原表格
| col1 | col2 | col3 |
|---|---|---|
| hello | 2 | 4 |
| world | 2 | 4 |
| bye | 2 | 4 |
预期更新后表格
| col1 | col2 | col3 |
|---|---|---|
| world | 2 | 4 |
正确实现方法
方法1:布尔索引过滤(最直接)
先获取需要移除的低计数值列表,再用isin()结合取反操作筛选保留的行:
# 获取低数据值列表 low_values = remove_low_data_states('col1') # 过滤出不包含这些值的行 filtered_df = df[~df['col1'].isin(low_values)]
方法2:用pd.drop实现(补全正确用法)
如果一定要用pd.drop,需要先定位到要删除行的索引,再传入drop方法:
low_values = remove_low_data_states('col1') # 获取要删除的行索引 drop_indices = df[df['col1'].isin(low_values)].index # 删除对应行 filtered_df = df.drop(index=drop_indices)
说明
pd.drop默认需要传入行索引或列名,直接传值列表是无效的,所以之前用drop没成功大概率是因为没正确获取目标行的索引。而布尔索引的方式更简洁直观,适合这类按值过滤的场景。
内容的提问来源于stack exchange,提问作者FalloutATS21
相关产品推荐
相关产品推荐

