使用Pandas在Python中筛选合并DataFrame:图书归属聚合需求
解决方法
你的核心问题在于没先处理分号分隔的多归属者,直接合并相同DataFrame完全达不到拆分聚合的目的。高效的处理步骤如下:
步骤1:读取数据并拆分归属者
先把用分号分隔的多个归属者拆成单独的行,同时清理可能存在的空格:
from pathlib import Path import pandas as pd # 读取原始数据 file1 = Path.cwd() / "./bookgrid.xlsx" df = pd.read_excel(file1) # 拆分归属者字符串为列表,同时去除每个名字的前后空格 df['Owner'] = df['Owner'].str.split(';').apply(lambda names: [n.strip() for n in names]) # 把列表拆成单独行,每个归属者对应原图书行 df_exploded = df.explode('Owner')
步骤2:按归属者聚合图书并转成宽格式
将同一归属者的所有图书收集起来,再展开为多列:
# 按归属者分组,把对应的图书整理成列表 grouped = df_exploded.groupby('Owner')['Book'].apply(list).reset_index() # 把图书列表拆分为多列,列名设为Book_1、Book_2... book_cols = grouped['Book'].apply(pd.Series).rename(columns=lambda idx: f"Book_{idx+1}") # 合并归属者列和图书列,得到最终结果 result = pd.concat([grouped['Owner'], book_cols], axis=1)
步骤3:保存结果
# 导出到Excel,不保留索引列 result.to_excel("./results.xlsx", index=False)
效果说明
假设原始数据有如下行:
《Alabama》 | julia;marry
《Python 101》 | julia
《Java Core》 | marry;bob
处理后会生成:
| Owner | Book_1 | Book_2 |
|---|---|---|
| bob | Java Core | NaN |
| julia | Alabama | Python 101 |
| marry | Alabama | Java Core |
内容的提问来源于stack exchange,提问作者Dinerz
相关产品推荐
相关产品推荐

