将多个CSV文件导入pandas并连接成一个DataFrame。

21 浏览
0 Comments

将多个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日
0
0 Comments

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

0
0 Comments

查看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)

0