如何不分组为Pandas DataFrame添加基于'best usage'的source列?
无需分组实现Pandas添加分组对应'best'来源列
需求说明
给目标Pandas DataFrame添加一列best,该列值对应每个year分组中usage为'best'的source字段值。
输入数据集
import pandas as pd df_in = pd.DataFrame({ 'year': [ 5, 5, 5, 10, 10, 15, 15, 30, 30, 30 ], 'usage': ['farm', 'best', '', 'manual', 'best', 'best', 'city', 'random', 'best', 'farm' ], 'value': [0.825, 0.83, 0.85, 0.935, 0.96, 1.12, 1.305, 1.34, 1.34, 1.455], 'source': ['wood', 'metal', 'water', 'metal', 'water', 'wood', 'water', 'wood', 'metal', 'water' ]})
预期输出
print(df) year usage value source best 0 5 farm 0.825 wood metal 1 5 best 0.830 metal metal 2 5 0.850 water metal 3 10 manual 0.935 metal water 4 10 best 0.960 water water 5 15 best 1.120 wood wood 6 15 city 1.305 water wood 7 30 random 1.340 wood metal 8 30 best 1.340 metal metal 9 30 farm 1.455 water metal
现有分组实现方案
grouped = df_in.groupby('usage').get_group('best') grouped = grouped.rename(columns={'source': 'best'}) df = df_in.merge(grouped[['year','best']],how='outer', on='year')
无需分组的实现方法
这里提供两种无需使用groupby的实现方式:
方法一:构建映射字典后映射
通过布尔索引直接筛选出usage='best'的行,构建year到对应source的映射字典,再用map方法为原数据集添加best列:
# 构建year与对应best来源的映射字典 best_source_map = df_in[df_in['usage'] == 'best'].set_index('year')['source'].to_dict() # 新增best列 df_in['best'] = df_in['year'].map(best_source_map)
方法二:布尔筛选后合并
直接用布尔索引提取目标行,再与原数据集按year合并,逻辑和原方案类似但无需分组操作:
# 提取usage为best的行,只保留year和source列并重命名 best_df = df_in.loc[df_in['usage'] == 'best', ['year', 'source']].rename(columns={'source': 'best'}) # 合并到原数据集 df = df_in.merge(best_df, on='year', how='outer')
这两种方法都能得到预期的输出结果,且全程没有使用groupby相关操作。
内容的提问来源于stack exchange,提问作者gregV
相关产品推荐
相关产品推荐

