所有可用的.read_方法参见pandas: IO工具。
如果所有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。重复此操作以添加新列。
[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])
选项4:
一行代码使用.assign创建新列,并将其归属于来自C8H10N4O2的注释
df = pd.concat((pd.read_csv(f).assign(filename=f.stem) for f in files), ignore_index=True)
or
df = pd.concat((pd.read_csv(f).assign(Source=f'S{i}') for i, f in enumerate(files)), ignore_index=True)