如何在pandas DataFrame中按规则新增sell及单店总销售额两列?
实现方案
步骤1:计算sell列
根据规则,unit_percent为空时sell取5,否则取units数值除以unit_percent数值:
import pandas as pd import numpy as np # 初始化示例DataFrame df = pd.DataFrame({ "store_id": ["1", "1", "2", "2", "3", "3"], "units": ["5 or less", "17", "5 or less", "5 or less", "28", "15"], "unit_percent": ["","0.37","","","0.57","0.48" ] }) # 计算sell列 def get_sell(row): if not row["unit_percent"].strip(): return 5 return int(row["units"]) / float(row["unit_percent"]) df["sell"] = df.apply(get_sell, axis=1)
步骤2:计算total_sell_per_store列
按store_id分组后按规则计算单店总销售额,仅在分组内第一行展示数值,其余行留空:
def get_store_total(group): # 筛选当前分组内unit_percent非空的行 valid_sell = group[group["unit_percent"].str.strip() != ""]["sell"] if len(valid_sell) > 0: # 存在有效行取最大sell值 total = valid_sell.max() else: # 无有效行取所有行sell求和 total = group["sell"].sum() # 仅第一行赋值,其余为NaN res = pd.Series([np.nan] * len(group), index=group.index) res.iloc[0] = total return res df["total_sell_per_store"] = df.groupby("store_id", group_keys=False).apply(get_store_total)
如果需要控制小数精度,可在计算环节增加round()方法处理即可。
内容的提问来源于stack exchange,提问作者Daven1
相关产品推荐
相关产品推荐

