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

如何基于Pandas中另一列的相同值设置指定列的取值

问题描述

现有一个Pandas DataFrame,结构如下(注意原代码中quarter的取值需改为字符串格式,否则会报错):

import pandas as pd

df_test = pd.DataFrame(data=None, columns=['file', 'quarter', 'status'])
df_test['file'] = ['file_1', 'file_1', 'file_2', 'file_3', 'file_3', 'file_4']
df_test['quarter'] = ['2023q1', '2023q2', '2022q4', '2022q3', '2023q2', '2021q3']
df_test['status'] = ['', 'kept', '', '', 'kept', '']

需求:根据file列中同名文件是否存在status为'kept'的记录,将该文件对应的所有status统一设置为'kept'或'removed'。最终status列结果应为:

['kept', 'kept', 'removed', 'kept', 'kept', 'removed']
解决方案

方法一:使用groupby + transform(推荐,适合大型数据集)

利用transform方法直接生成与原DataFrame长度匹配的结果序列,无需额外映射步骤:

df_test['status'] = df_test.groupby('file')['status'].transform(
    lambda group: 'kept' if (group == 'kept').any() else 'removed'
)

# 验证结果
print(df_test['status'].tolist())

逻辑说明

  • groupby('file')['status']按文件名分组,聚焦status列
  • transform对每个分组执行lambda函数:检查分组内是否存在至少一个'kept',是则返回'kept',否则返回'removed'
  • 结果自动对齐原DataFrame的行,直接赋值即可更新status列

方法二:构建映射字典后批量替换

先计算每个文件对应的状态并存储为字典,再通过map批量替换,适合分组数量较多的场景:

# 生成文件-状态映射字典
file_status_map = df_test.groupby('file')['status'].apply(
    lambda group: 'kept' if (group == 'kept').any() else 'removed'
).to_dict()

# 批量替换status列
df_test['status'] = df_test['file'].map(file_status_map)

# 验证结果
print(df_test['status'].tolist())

逻辑说明

  • groupby + apply计算每个文件的最终状态,转成字典后仅需一次映射操作
  • map方法基于字典快速替换,对于超大数据集,这种方式的内存效率更高

内容的提问来源于stack exchange,提问作者Marcus K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 17:37:31