You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为DataFrame各列设置不同索引过滤条件并高效实现?

针对Pandas DataFrame按列设置不同索引过滤条件的高效实现方法

你需要对Pandas DataFrame的每一列应用不同的索引过滤规则,保留符合条件的值,其余设为NaN(或转为0)。

示例数据

import pandas as pd

data = {'a': [1,2,3,4,5],
        'b': [10,20,30,40,50],
        'c': [1,1,1,1,1]}
df = pd.DataFrame(data)

原始DataFrame:

a   b  c
0  1  10  1
1  2  20  1
2  3  30  1
3  4  40  1
4  5  50  1

需求

  • 列a保留索引<3的值
  • 列b保留索引<2的值
  • 列c保留索引=4的值

预期结果

a     b    c
0  1.0  10.0  NaN
1  2.0  20.0  NaN
2  3.0   NaN  NaN
4  NaN   NaN  1.0

你的原始拆分合并方法是可行的,但可以通过以下更高效的方式实现:


方法一:字典映射条件 + where批量处理

通过定义列与过滤条件的映射字典,结合where方法实现向量化批量处理,无需拆分DataFrame:

# 定义各列对应的索引过滤条件
filter_conditions = {
    'a': df.index < 3,
    'b': df.index < 2,
    'c': df.index == 4
}

# 对每一列应用对应条件,不符合的设为NaN
df_result = df.where(lambda x: filter_conditions[x.name])

该方法利用Pandas的向量化操作,性能优于多次loc+concat,且代码更简洁易维护。

方法二:将NaN转为0

如果需要把结果中的NaN替换为0,只需在上述结果后调用fillna:

df_result = df.where(lambda x: filter_conditions[x.name]).fillna(0)

转换后的结果:

a     b    c
0  1.0  10.0  0.0
1  2.0  20.0  0.0
2  3.0   0.0  0.0
3  0.0   0.0  0.0
4  0.0   0.0  1.0

方法三:使用mask反向操作

mask方法会将符合条件的值替换为NaN,逻辑与where相反,同样可以实现需求:

df_result = df.mask(lambda x: ~filter_conditions[x.name])

优势总结

  • 代码紧凑,无需拆分合并DataFrame
  • 向量化操作性能更优
  • 扩展性强,新增列只需在filter_conditions中补充对应规则即可

内容的提问来源于stack exchange,提问作者Henkie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:26:14