如何合并列名相同的多个CSV文件并生成指定结构的合并表格
合并多份CSV文件并按公司对齐补全数据
我来帮你搞定这个CSV合并的需求!用Python的pandas库就能轻松实现,下面是详细的步骤和代码:
首先,确保你已经安装了pandas,如果还没装,打开终端运行这个命令:
pip install pandas
接下来是具体的代码实现,我会逐行解释:
import pandas as pd # 1. 读取三个CSV文件,注意你的文件用|作为分隔符,所以要指定sep参数 june_df = pd.read_csv('june.csv', sep='|') july_df = pd.read_csv('july.csv', sep='|') august_df = pd.read_csv('august.csv', sep='|') # 2. 清理数据:去除列名和company_name中的空格,同时把数值列转成整数 # 因为你的CSV里分隔符|两边有空格,读取后会带多余空格,必须处理 for df in [june_df, july_df, august_df]: # 去除列名的前后空格 df.columns = df.columns.str.strip() # 去除公司名称的前后空格 df['company_name'] = df['company_name'].str.strip() # 把员工数和花费转成整数类型 df['number_of_employers'] = df['number_of_employers'].astype(int) df['money_spend'] = df['money_spend'].astype(int) # 3. 给每个月份的列添加前缀,避免合并时列名冲突 june_df = june_df.rename(columns={ 'number_of_employers': 'june_number_of_employers', 'money_spend': 'june_money_spend' }) july_df = july_df.rename(columns={ 'number_of_employers': 'july_number_of_employers', 'money_spend': 'july_money_spend' }) august_df = august_df.rename(columns={ 'number_of_employers': 'august_number_of_employers', 'money_spend': 'august_money_spend' }) # 4. 按company_name进行外连接,这样所有公司都会被保留,不管哪个月份有数据 # 先合并august和july,再合并june(如果不需要june可以跳过这一步) merged_df = august_df.merge(july_df, on='company_name', how='outer') merged_df = merged_df.merge(june_df, on='company_name', how='outer') # 5. 把缺失的数值填充为0,也就是某个月份没有该公司数据时补0 merged_df = merged_df.fillna(0) # 6. 把填充后的浮点数转成整数(因为fillna后数值会变成浮点数) numeric_cols = [col for col in merged_df.columns if col != 'company_name'] merged_df[numeric_cols] = merged_df[numeric_cols].astype(int) # 7. 调整列的顺序,完全匹配你想要的结构 desired_order = [ 'company_name', 'august_number_of_employers', 'august_money_spend', 'july_number_of_employers', 'july_money_spend', 'june_number_of_employers', 'june_money_spend' ] merged_df = merged_df[desired_order] # 8. 保存合并后的文件,同样用|作为分隔符,不保存索引列 merged_df.to_csv('merged_months.csv', sep='|', index=False)
代码说明:
- 清理数据:因为你的CSV是用
|分隔且两边带空格,所以必须先去除空格,否则合并时会因为公司名称带空格导致匹配失败。 - 外连接(how='outer'):这是关键,能保证所有出现在任意一个CSV里的公司都会被保留,不会丢失数据。
- 填充0:用
fillna(0)把缺失的月份数据补成0,完全符合你要的输出格式。
如果只需要合并july和august,直接去掉june相关的代码即可,运行后就能得到你示例中的结果啦!
内容的提问来源于stack exchange,提问作者Kristina




