将多个CSV文件导入pandas并连接成一个DataFrame。
将多个CSV文件导入pandas并连接成一个DataFrame。
我想从一个目录中读取几个CSV文件并将它们连接成一个大的DataFrame。但我还无法解决它。这是我到目前为止所做的事情:
import glob import pandas as pd # Get data file names path = r'C:\DRO\DCL_rawdata_files' filenames = glob.glob(path + "/*.csv") dfs = [] for filename in filenames: dfs.append(pd.read_csv(filename)) # Concatenate all data into one DataFrame big_frame = pd.concat(dfs, ignore_index=True)
我想在for循环中得到一些帮助?
admin 更改状态以发布 2023年5月21日
darindaCoder回答的另一个选择:
path = r'C:\DRO\DCL_rawdata_files' # use your path all_files = glob.glob(os.path.join(path, "*.csv")) # advisable to use os.path.join as this makes concatenation OS independent df_from_each_file = (pd.read_csv(f) for f in all_files) concatenated_df = pd.concat(df_from_each_file, ignore_index=True) # doesn't create a list, nor does it append to one
查看Pandas:IO工具 获取所有可用的.read_
方法。
如果所有CSV文件具有相同的列,则尝试以下代码。
我添加了header = 0
,因此在读取CSV文件的第一行后,它可以被分配为列名。
import pandas as pd import glob import os path = r'C:\DRO\DCL_rawdata_files' # use your path all_files = glob.glob(os.path.join(path , "/*.csv")) li = [] for filename in all_files: df = pd.read_csv(filename, index_col=None, header=0) li.append(df) frame = pd.concat(li, axis=0, ignore_index=True)
或者,参考Sid的评论。
all_files = glob.glob(os.path.join(path, "*.csv")) df = pd.concat((pd.read_csv(f) for f in all_files), ignore_index=True)
- 通常需要识别每个数据样本,可以通过向数据帧添加新列来实现。
- 本示例将使用标准库中的
pathlib
。它将路径视为具有方法的对象,而不是要进行分割的字符串。
导入和设置
from pathlib import Path import pandas as pd import numpy as np path = r'C:\DRO\DCL_rawdata_files' # or unix / linux / mac path # Get the files from the path provided in the OP files = Path(path).glob('*.csv') # .rglob to get subdirectories
选项1:
- 使用文件名添加新列
dfs = list() for f in files: data = pd.read_csv(f) # .stem is method for pathlib objects to get the filename w/o the extension data['file'] = f.stem dfs.append(data) df = pd.concat(dfs, ignore_index=True)
选项2:
- 使用
enumerate
添加一个具有通用名称的新列
dfs = list() for i, f in enumerate(files): data = pd.read_csv(f) data['file'] = f'File {i}' dfs.append(data) df = pd.concat(dfs, ignore_index=True)
选项3:
- 使用列表推导创建数据框,然后使用
np.repeat
添加新列。[f'S{i}' for i in range(len(dfs))]
创建一个命名每个数据框的字符串列表。[len(df) for df in dfs]
创建一个长度的列表。
- 此选项的归属归功于这个绘图的答案。
# Read the files into dataframes dfs = [pd.read_csv(f) for f in files] # Combine the list of dataframes df = pd.concat(dfs, ignore_index=True) # Add a new column df['Source'] = np.repeat([f'S{i}' for i in range(len(dfs))], [len(df) for df in dfs])
选择四:
df = pd.concat((pd.read_csv(f).assign(filename=f.stem) for f in files), ignore_index=True)
或者
df = pd.concat((pd.read_csv(f).assign(Source=f'S{i}') for i, f in enumerate(files)), ignore_index=True)