如何用Pandas分组CSV重复邮箱行并合并站点列,导出CSV并解决空DataFrame问题
需求与解决方案
原始数据
用户的favsites.csv内容如下:
Emails Favorite Site batman@email.com something.com batman@email.com hamburgers.com poisonivy@email.com yonder.com superman@email.com cookies.com catgirl@email.com cattreats.com catgirl@email.com fishcaviar.com catgirl@email.com elegantfashion.com joker@email.com cards.com supergirl@email.com nailart.com
期望输出
形式一:同一邮箱对应站点在单元格内换行
Emails Favorite Site batman@email.com something.com hamburgers.com poisonivy@email.com yonder.com superman@email.com cookies.com catgirl@email.com cattreats.com fishcaviar.com elegantfashion.com joker@email.com cards.com supergirl@email.com nailart.com
形式二:同一邮箱对应站点拆分为多列/同一列空格分隔
Emails Favorite Site batman@email.com something.com hamburgers.com poisonivy@email.com yonder.com superman@email.com cookies.com catgirl@email.com cattreats.com fishcaviar.com elegantfashion.com joker@email.com cards.com supergirl@email.com nailart.com
问题分析
你当前代码的核心问题:
groupby(['Emails', 'Favorite Site'])是按邮箱+站点双重分组,等于没有合并重复邮箱的记录;agg('sum')仅针对数值列生效,你的数据全是字符串列,因此返回空DataFrame。
解决方案
实现形式一(单元格内换行合并)
按邮箱分组,将同一邮箱的站点用换行符\n连接,导出时Pandas会自动用引号包裹含换行的单元格,确保CSV格式正确:
import pandas as pd input_path = 'favsites.csv' output_path = 'merged_form1.csv' # 读取空格分隔的CSV(原始数据用空格分隔,需指定sep参数) df = pd.read_csv(input_path, sep='\s+') # 按邮箱分组,合并站点为换行分隔的字符串 merged_df = df.groupby('Emails')['Favorite Site'].agg('\n'.join).reset_index() # 导出CSV,不保留索引 merged_df.to_csv(output_path, index=False)
实现形式二(两种可选方式)
方式1:同一列用空格分隔站点(匹配示例格式)
import pandas as pd input_path = 'favsites.csv' output_path = 'merged_form2.csv' df = pd.read_csv(input_path, sep='\s+') # 按邮箱分组,合并站点为空格分隔的字符串 merged_df = df.groupby('Emails')['Favorite Site'].agg(' '.join).reset_index() merged_df.to_csv(output_path, index=False)
方式2:拆分为独立列(站点多列显示)
import pandas as pd input_path = 'favsites.csv' output_path = 'merged_form2_multi_col.csv' df = pd.read_csv(input_path, sep='\s+') # 按邮箱分组,将站点转为列表 grouped = df.groupby('Emails')['Favorite Site'].apply(list).reset_index() # 将列表扩展为多列 expanded_df = pd.DataFrame(grouped['Favorite Site'].tolist(), index=grouped['Emails']).reset_index() # 重命名列名 expanded_df.columns = ['Emails'] + [f'Favorite Site {i+1}' for i in range(expanded_df.shape[1]-1)] expanded_df.to_csv(output_path, index=False)
内容的提问来源于stack exchange,提问作者noobCoder
相关产品推荐
相关产品推荐

