pandas如何向groupby分组插入仅prop_dtls改为nano的新行
pandas实现分组后插入指定行方案
前置说明
你问题描述中写的groupby(by=['md_code','prop_dtls'])属于笔误,从期望输出可判断实际分组维度为effective_date和md_code的组合,以下方案均基于该分组逻辑实现。
完整实现代码
步骤1:构造示例DataFrame
import pandas as pd # 按你给出的原始数据构造 df = pd.DataFrame([ ["2021-03-23", "comm", "car"], ["2021-03-23", "comm", "bike"], ["2021-03-23", "comm", "scooter"], ["2021-03-24", "comm", "car"], ["2021-03-24", "comm", "bike"], ["2021-03-24", "comm", "scooter"], ["2021-03-12", "dme", "bus"], ["2021-03-12", "dme", "eco"], ["2021-03-12", "dme", "alto"], ["2021-03-14", "dme", "bus"], ["2021-03-14", "dme", "eco"], ["2021-03-14", "dme", "alto"], ["2021-03-12", "equity", "bus"], ["2021-03-12", "equity", "eco"], ["2021-03-12", "equity", "alto"], ["2021-03-14", "equity", "bus"], ["2021-03-14", "equity", "eco"], ["2021-03-14", "equity", "alto"], ], columns=["effective_date", "md_code", "prop_dtls"])
方案1:groupby+apply实现(逻辑直观,适合小数据量)
def add_nano_row(group): # 取分组第一行修改prop_dtls为nano,拼接在原分组末尾 new_row = group.iloc[:1].copy() new_row["prop_dtls"] = "nano" return pd.concat([group, new_row], ignore_index=True) # 按effective_date和md_code分组执行插入逻辑 df_result = df.groupby( by=["effective_date", "md_code"], group_keys=False ).apply(add_nano_row).reset_index(drop=True)
方案2:批量生成新增行拼接(性能更高,适合大数据量)
# 提取所有唯一的分组组合 unique_groups = df[["effective_date", "md_code"]].drop_duplicates() # 生成所有待插入的nano行 add_rows = unique_groups.assign(prop_dtls="nano") # 新增排序标记保证输出顺序符合要求 df["sort_flag"] = 0 add_rows["sort_flag"] = 1 # 合并原数据与新增行后排序、清理标记列 df_result = pd.concat([df, add_rows], ignore_index=True)\ .sort_values(by=["effective_date", "md_code", "sort_flag"])\ .drop("sort_flag", axis=1)\ .reset_index(drop=True)
结果验证
执行以下代码可打印符合你要求的csv格式输出:
print(df_result.to_csv(index=False))
内容的提问来源于stack exchange,提问作者Anil Tiwari
相关产品推荐
相关产品推荐

