悠悠楠杉
Pandas教程:高效聚合多行数据并合并为逗号分隔列,pandas 合并多列
Pandas教程:高效聚合多行数据并合并为逗号分隔列
在日常的数据处理任务中,我们经常会遇到这样的场景:原始数据表中存在多个重复的主键(如用户ID、订单编号等),而每个主键对应多条记录,每条记录包含不同的属性值。为了便于后续分析或报表输出,我们需要将这些多行数据按主键进行聚合,并将某些字段的值合并成一个以逗号分隔的字符串。
例如,在用户行为日志中,同一个用户可能访问了多个页面,我们希望最终得到一张表,每一行代表一个用户,其“访问页面”字段是一个由所有访问页面名称组成的逗号分隔字符串。这种操作虽然看似简单,但如果处理不当,可能会导致性能低下甚至内存溢出。本文将介绍如何使用Pandas高效实现这一目标。
假设我们有如下结构的原始数据:
python
import pandas as pd
data = {
'userid': [1, 1, 2, 2, 3],
'pagevisited': ['首页', '商品页', '购物车', '结算页', '首页']
}
df = pd.DataFrame(data)
我们的目标是将相同user_id对应的page_visited合并为一个字符串,结果形如:
user_id page_visited
0 1 首页,商品页
1 2 购物车,结算页
2 3 首页
最直接的方法是使用groupby配合agg函数。Pandas允许我们在聚合时对不同列应用不同的函数。对于需要合并为字符串的列,我们可以传入一个自定义的lambda函数,利用join方法将组内所有值拼接起来:
python
result = df.groupby('user_id')['page_visited'].agg(lambda x: ','.join(x)).reset_index()
这段代码首先按user_id分组,然后对每组中的page_visited列应用join操作,最后通过reset_index()将分组索引还原为普通列,确保结果仍是一个标准的DataFrame。
如果原始数据中存在缺失值(NaN),直接使用join会导致结果中出现nan字符串,影响可读性。为此,我们可以在合并前先过滤掉空值:
python
result = df.groupby('user_id')['page_visited'].agg(
lambda x: ','.join(x.dropna())
).reset_index()
更进一步,当需要同时处理多个需要合并的字段时,可以使用字典形式为不同列指定不同的聚合方式。比如,除了页面访问记录外,我们还想统计每个用户的访问次数,并保留最后一次访问时间:
python
data = {
'userid': [1, 1, 2, 2, 3],
'pagevisited': ['首页', '商品页', '购物车', '结算页', '首页'],
'visit_time': ['2024-05-01', '2024-05-02', '2024-05-01', '2024-05-03', '2024-05-04'],
'duration': [120, 180, 90, 210, 60]
}
df = pd.DataFrame(data)
result = df.groupby('userid').agg({
'pagevisited': lambda x: ','.join(x),
'visittime': 'last',
'duration': 'sum'
}).resetindex()
这样,我们就能在一个操作中完成多种聚合逻辑,既提升了效率,又保持了代码的清晰性。
值得注意的是,当数据量较大时,频繁的字符串拼接可能成为性能瓶颈。在这种情况下,可以考虑先将字符串列转换为类别类型(category),以减少内存占用和提升处理速度:
python
df['page_visited'] = df['page_visited'].astype('category')
此外,若需避免重复值的冗余合并(如某用户多次访问同一页面),可在join前使用unique()去重:
python
lambda x: ','.join(x.unique())
整个流程不仅适用于页面访问日志,也可广泛应用于标签合并、订单商品汇总、用户兴趣点整合等场景。掌握这一技巧,能显著提升数据清洗与预处理的效率,让复杂的数据变得简洁有序,为后续建模或可视化打下坚实基础。
