合并多个excel文件的两种方法:pandas/xlrd

其实逻辑都一样,就是提取出想要的数据,然后写入新的列表,对多个文件重复操作,最终将这多个文件中提取出的数据合并到一个嵌套的列表中,再写入新的excel文件

Part1:xlrd合并多个excel中指定的数据

①按每行指定列的数据进行提取

②合并提取出的数据(本质上是列表的合并)

③写入新的Excel文件

import xlrd
import os
import pandas


# 导入多个文件的路径,读取
path = r"C:/data_count"
files = os.listdir(path)
datas = []                 # 这里是先定义一个空列表,最后把数据放进去
for file in files:
    firm_name = re.sub('_.+?','',file.strip())
    workbook = xlrd.open_workbook(path+'/'+file)

    # 打开workbook的指定sheet
    sheet = workbook.sheets()[0]
    # 读取行数
    max_row=sheet.nrows
    for row in range(1, max_row):
        # 写入数据
        data = [firm_name, sheet.cell(row, 1).value, sheet.cell(row, 4).value, sheet.cell(row, 5).value]
        print(data)
        # 打包加入嵌套列表
        datas.append(data)


# 最后正常写入新文件即可
frame = pd.DataFrame(datas, columns=['firm_name','year', 'content1', 'content2'],dtype=int)
frame.to_excel(r'C:\合并.xlsx')

Part2:pandas合并多个excel文件

2.1 merge

这种方法适用于数据格式不标准,需要对齐处理的

docs = os.listdir(path)
dfs = []                # 提前定义好一个收纳所有df的dfs列表
# names = []
for doc in docs:
    print(doc)
    df = pd.read_excel(path+'/'+doc)
    df.columns = df.columns.str.replace('\n','')
    for j in range(len(df)):                # 遍历df的每一行
        n = df['学校名称'][j]
        df.loc[j, '学校名称'] = re.sub('\(|(','',str(n)).replace(')','').replace('(','').replace(')','')              # 对该列的每一行的值进行字符处理(loc索引)
        # 注意,这里是对原df进行原位处理,没有生成新的df
        print(df.shape)
        dfs.append(df)

# 最关键的一步,将列表dfs写入新的df
df_merge = reduce(lambda left,right: pd.merge(left,right,on='学校名称'), dfs)
# print(df_merge.head())
print(df_merge.shape)
df_merge.to_excel(path+output)

2.2 concat

这种方法适用于数据格式标准,无需对齐的(与Part1的应用场景相同)

docs = os.listdir(path)
dfs = []
for doc in docs:
    print(doc)
    df = pd.read_excel(path+'/'+doc, index_col=None)
    df.columns = df.columns.str.replace('\n', '').str.replace('(', '').str.replace(')', '').str.replace('(', '').str.replace(')', '')
    print(df.shape)
    # print(df.columns)
    dfs.append(df)
df_new = pd.concat(df, axis=1)  # 注:axis=1表示竖着连接
# dfs可以直接是[df1, df2, ..., dfn]

print(df_new.head())
df_new.to_excel(path+output)

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值