Pandas DataFrame分组时如何保留带空格的原始行名称
问题描述
原始DataFrame:
name count ------------------- apple pie 1 applepie 3 blueberries 2 green tea 1
现有分组代码:
df["sans_spaces"] = df["name"].str.replace(" ", "") grouped_df = df.groupby("sans_spaces", as_index=False).aggregate({"count": "sum"})
执行后得到的结果:
name count ------------------- applepie 4 blueberries 2 greentea 1
期望实现的最终结果:
name count ------------------- apple pie 4 blueberries 2 green tea 1
需要解决的核心问题:分组求和后,保留带空格的原始名称值,而非去空格后的字符串。
解决方法
方法1:聚合时同时保留原始名称的第一个出现值
修改聚合逻辑,在aggregate中同时指定name字段的处理规则,直接取每组内第一个出现的原始名称:
df["sans_spaces"] = df["name"].str.replace(" ", "") grouped_df = df.groupby("sans_spaces", as_index=False).aggregate( {"count": "sum", "name": "first"} ) # 移除辅助列(可选) grouped_df = grouped_df.drop("sans_spaces", axis=1)
方法2:无需新增列,直接用去空格字符串作为分组键
可以跳过新增sans_spaces列的步骤,直接在groupby中使用去空格后的字符串作为分组依据:
grouped_df = df.groupby(df["name"].str.replace(" ", ""), as_index=False).aggregate( {"count": "sum", "name": "first"} )
方法3:优先保留带空格的原始名称
如果每组内存在多种格式的名称(如同时有带空格和不带空格的),想强制优先保留带空格的名称,可以自定义聚合函数:
def pick_preferred_name(names): # 遍历组内名称,返回第一个带空格的,无则返回第一个元素 for name in names: if " " in name: return name return names.iloc[0] df["sans_spaces"] = df["name"].str.replace(" ", "") grouped_df = df.groupby("sans_spaces", as_index=False).aggregate( {"count": "sum", "name": pick_preferred_name} ).drop("sans_spaces", axis=1)
以上方法均可实现分组求和后保留带空格的原始名称的需求。
内容的提问来源于stack exchange,提问作者user24995271
相关产品推荐
相关产品推荐

