在Pandas数据处理场景中,经常需要根据某一列或多列对数据进行分组,同时对多个列进行聚合操作,其中自定义字符串拼接是高频需求。通过groupby结合agg方法,可以灵活实现不同规则的字符串拼接逻辑,适配各类数据处理场景。

基础分组聚合与agg方法说明
Pandas的groupby方法用于按照指定维度对数据进行分组,agg方法则可以对分组后的不同列应用不同的聚合函数。要实现自定义字符串拼接,核心是在agg中传入自定义的拼接函数,函数内部根据需求处理多个列的字符串组合逻辑。
首先创建一个示例数据集,方便后续演示操作:
import pandas as pd
# 创建示例数据
data = {
"category": ["A", "A", "B", "B", "B"],
"name": ["苹果", "香蕉", "橙子", "梨", "葡萄"],
"price": [5, 3, 4, 6, 7]
}
df = pd.DataFrame(data)
print(df)
单分组维度下多列自定义拼接
假设我们需要按照category分组,将每个分组下的name列和price列拼接成自定义格式的字符串,比如用竖线分隔,格式为「名称:价格」。
首先定义自定义拼接函数,函数接收分组后的子DataFrame,遍历每一行组合两个列的内容:
def custom_concat(group):
# 遍历分组内的每一行,拼接name和price
result_list = []
for _, row in group.iterrows():
concat_str = f"{row['name']}:{row['price']}"
result_list.append(concat_str)
# 用竖线连接所有拼接后的字符串
return "|".join(result_list)
# 使用groupby和agg应用自定义函数
result = df.groupby("category").agg(
concat_result=custom_concat
)
print(result)
上述代码会输出每个category分组下,所有name和price组合后的拼接字符串,分隔符为竖线,单个元素格式为名称加价格。
多分组维度下的多列拼接
如果有多个分组维度,比如同时按照category和另一个列分组,操作流程基本一致,只需要在groupby中传入多个分组列名即可:
# 新增一个分组列
df["region"] = ["华东", "华东", "华南", "华南", "华南"]
# 多维度分组聚合
multi_group_result = df.groupby(["category", "region"]).agg(
concat_result=custom_concat
)
print(multi_group_result)
不同列使用不同拼接规则
如果需要对不同的列使用不同的拼接规则,可以在agg中为每个列单独指定对应的处理函数,示例如下:
def concat_name(group):
return ",".join(group["name"].tolist())
def concat_price(group):
return "-".join(map(str, group["price"].tolist()))
# 不同列应用不同的拼接函数
diff_rule_result = df.groupby("category").agg(
name_concat=concat_name,
price_concat=concat_price
)
print(diff_rule_result)
注意事项
- 自定义拼接函数接收的参数是分组后的子DataFrame,因此可以直接操作多个列的数据
- 如果拼接的内容不是字符串类型,需要先转换为字符串再进行拼接,避免出现类型错误
- agg中传入自定义函数时,函数名不需要加括号,直接传入函数引用即可
- 拼接分隔符可以根据需求调整,比如逗号、空格、特殊符号等,只需要修改join方法的参数
如果需要处理大量数据,自定义函数的方式可能效率不如内置向量化方法,此时可以考虑先对列进行向量化处理再拼接,提升运行速度。