合并多个Excel到Pandas DataFrame时源文件列赋值错误,求排查
合并Excel文件时Source_file列全部显示最后一个文件名的问题解决
我来帮你捋捋这个问题~你当前代码里的问题出在循环中的这两行逻辑:
df['Source_file'] = f df = df.append(data)
每次循环你都是先给整个总DataFrame的Source_file列赋值为当前文件名f,再把新读取的数据追加进去。这就导致:第一次循环时,空的总df被加上了全是第一个文件名的Source_file列,然后追加数据;第二次循环时,你又把总df里所有行的Source_file改成了第二个文件名(包括第一次追加的那些行),再追加新数据……循环到最后,所有行的Source_file自然都变成最后一个文件的名字了。
正确的思路应该是:给当前读取的单文件数据添加Source_file列,再把这个带标记的数据追加到总df里,而不是去修改总df的列。修正后的代码如下:
import pandas as pd import os # 获取当前路径下的所有xlsx文件 path = os.getcwd() files_xlsx = [f for f in os.listdir(path) if f.endswith('xlsx')] # 创建空的总DataFrame df = pd.DataFrame() # 循环读取每个文件并合并 for f in files_xlsx: # 读取当前文件的数据 data = pd.read_excel(f, 'Sheet 1') # 给当前单文件数据添加源文件名列,值为当前文件名 data['Source_file'] = f # 将带标记的数据追加到总DataFrame,ignore_index避免索引重复 df = df.append(data, ignore_index=True)
另外还有两个小优化点:
- 用
f.endswith('xlsx')比f[-4:] == 'xlsx'更稳妥,能避免误判.xlsm这类类似后缀的文件 - 追加时加上
ignore_index=True,可以防止合并后出现重复索引的问题
如果你用的是pandas 1.4.0及以上版本,append()方法已经被标记为过时,更推荐用pd.concat()来合并,代码可以改成这样:
import pandas as pd import os path = os.getcwd() files_xlsx = [f for f in os.listdir(path) if f.endswith('xlsx')] # 先收集所有带标记的单文件DataFrame dfs_list = [] for f in files_xlsx: data = pd.read_excel(f, 'Sheet 1') data['Source_file'] = f dfs_list.append(data) # 一次性合并所有DataFrame df = pd.concat(dfs_list, ignore_index=True)
这种写法不仅更高效,也更贴合pandas的最新规范~
内容的提问来源于stack exchange,提问作者scotton16
相关产品推荐
相关产品推荐

