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

Pandas DataFrame基于多列条件批量修改多列值的实现方法咨询

完整实现方案

你可以直接用以下Pandas矢量化操作实现需求,全程无需逐行遍历,适合大样本量场景:

import pandas as pd

# 构造示例数据
df = pd.DataFrame({
    'start': [1,2,3,4,5],
    't': [6,7,5,5,2],
    's1': [0,92,0,0,99],
    's2': [99,0,0,83,76],
    's3': [0,0,0,22,0]
}, index=[95,110,129,391,444])

# 步骤1:筛选所有s开头的样本列
s_cols = df.filter(like='s').columns.tolist()

# 步骤2:构建start值到s列的查找表
s_lookup = df.set_index('start')[s_cols]

# 步骤3:逐列做二进制编码转换
for col in s_cols:
    # 第一位:当前行s列值>0则为1,否则为0
    bit1 = (df[col] > 0).astype(int).astype(str)
    # 第二位:t对应start行的同s列值>0则为1,不存在/值为0则为0
    bit2 = (s_lookup.reindex(df['t'])[col] > 0).astype(int).astype(str)
    # 拼接两位编码
    df[col] = bit1 + bit2

print(df)

运行后输出和你给出的转换后示例完全一致。


对应问题解答

  • 遍历所有s样本列最合适的Pandas方法:
    优先用df.filter(like='s')动态筛选所有s开头的列,避免手动输入列名的冗余和错误。遍历过程仅需要对列做循环,所有行计算用Pandas内置矢量化操作完成,性能远高于逐行iterrows/apply方案。
  • 如何根据t列的值定位到start列的对应行:
    提前构建以start值为索引的查找表df.set_index('start')[s_cols],后续直接调用reindex(df['t'])即可一次性批量返回所有行t值对应的start行的所有s列值,不存在的t值会自动返回NaN,刚好匹配“未查询到则第二位为0”的规则。如果可以通过t值直接匹配索引,直接用索引构建查找表性能会更高。
  • 如何实现>0的条件校验:
    直接用Pandas列级布尔比较df[col] > 0即可完成整列的条件校验,返回的布尔序列直接转int就可以得到0/1值,无需逐行判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:06:04