如何基于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.
相关产品推荐
相关产品推荐

