Python 在10个不同的子目录中合并多个同名csv文件
我有10个不同的子目录,每个目录中有相同的文件名(每个目录20个文件),列0是每个文件中的索引列 e、 g 我想合并每个子目录中同名的所有文件 放入1个同名文件中,并将新文件保存到新的子目录中 e、 g目录文件\u与索引=列0合并。合并文件 每个文件中只有一个索引列,列为1,2,3,4,5 每个目录中的名称相同 我已将csv文件读入熊猫数据框Python 在10个不同的子目录中合并多个同名csv文件,python,csv,pandas,Python,Csv,Pandas,我有10个不同的子目录,每个目录中有相同的文件名(每个目录20个文件),列0是每个文件中的索引列 e、 g 我想合并每个子目录中同名的所有文件 放入1个同名文件中,并将新文件保存到新的子目录中 e、 g目录文件\u与索引=列0合并。合并文件 每个文件中只有一个索引列,列为1,2,3,4,5 每个目录中的名称相同 我已将csv文件读入熊猫数据框 df= pd.read_csv(filename, sep=",", header = None, usecols=[0, 1, 2, 3, 4,
df= pd.read_csv(filename, sep=",", header = None, usecols=[0, 1, 2, 3, 4, 5])
下面是dataframe的格式
df= pd.read_csv(filename, sep=",", header = None, usecols=[0, 1, 2, 3, 4, 5])
我的初始原始数据帧:
0 1 2 3 4 5
0 1451606820 1.0862 1.08630 1.08578 1.08578 25
1 1451608800 1.0862 1.08630 1.08578 1.08610 10
2 1451608860 1.0862 1.08620 1.08578 1.08578 16
3 1451610180 1.0862 1.08630 1.08578 1.08578 27
4 1451610480 1.0858 1.08590 1.08560 1.08578 21
5 1451610540 1.0857 1.08578 1.08570 1.08578 2
6 1451610600 1.0857 1.08578 1.08570 1.08578 2
7 1451610720 1.0857 1.08578 1.08570 1.08578 2
8 1451610780 1.0857 1.08578 1.08570 1.08578 2
Column '0' = Datetime in Epoch time
Columns 1,2,3,4,5 are values
有很多方法可以做到这一点,我做了以下几件事 使用文件结构
root/
├── dir1/
│ ├── data_20170101_k
│ ├── data_20170102_k
│ ├── ...
├── dir2/
│ ├── data_20170101_k
│ └── data_20170101_k
│ └── ...
└── ...
这段代码可以工作,解释起来有点冗长,但您可以通过实现缩短它
import glob
import pandas as pd
CONCAT_DIR = "/FILES_CONCAT/"
# Use glob module to return all csv files under root directory. Create DF from this.
files = pd.DataFrame([file for file in glob.glob("root/*/*")], columns=["fullpath"])
# fullpath
# 0 root\dir1\data_20170101_k.csv
# 1 root\dir1\data_20170102_k.csv
# 2 root\dir2\data_20170101_k.csv
# 3 root\dir2\data_20170102_k.csv
# Split the full path into directory and filename
files_split = files['fullpath'].str.rsplit("\\", 1, expand=True).rename(columns={0: 'path', 1:'filename'})
# path filename
# 0 root\dir1 data_20170101_k.csv
# 1 root\dir1 data_20170102_k.csv
# 2 root\dir2 data_20170101_k.csv
# 3 root\dir2 data_20170102_k.csv
# Join these into one DataFrame
files = files.join(files_split)
# fullpath path filename
# 0 root\dir1\data_20170101_k.csv root\dir1 data_20170101_k.csv
# 1 root\dir1\data_20170102_k.csv root\dir1 data_20170102_k.csv
# 2 root\dir2\data_20170101_k.csv root\dir2 data_20170101_k.csv
# 3 root\dir2\data_20170102_k.csv root\dir2 data_20170102_k.csv
# Iterate over unique filenames; read CSVs, concat DFs, save file
for f in files['filename'].unique():
paths = files[files['filename'] == f]['fullpath'] # Get list of fullpaths from unique filenames
dfs = [pd.read_csv(path, header=None) for path in paths] # Get list of dataframes from CSV file paths
concat_df = pd.concat(dfs) # Concat dataframes into one
concat_df.to_csv(CONCAT_DIR + f) # Save dataframe
有很多方法可以做到这一点,我做了以下几件事 使用文件结构
root/
├── dir1/
│ ├── data_20170101_k
│ ├── data_20170102_k
│ ├── ...
├── dir2/
│ ├── data_20170101_k
│ └── data_20170101_k
│ └── ...
└── ...
这段代码可以工作,解释起来有点冗长,但您可以通过实现缩短它
import glob
import pandas as pd
CONCAT_DIR = "/FILES_CONCAT/"
# Use glob module to return all csv files under root directory. Create DF from this.
files = pd.DataFrame([file for file in glob.glob("root/*/*")], columns=["fullpath"])
# fullpath
# 0 root\dir1\data_20170101_k.csv
# 1 root\dir1\data_20170102_k.csv
# 2 root\dir2\data_20170101_k.csv
# 3 root\dir2\data_20170102_k.csv
# Split the full path into directory and filename
files_split = files['fullpath'].str.rsplit("\\", 1, expand=True).rename(columns={0: 'path', 1:'filename'})
# path filename
# 0 root\dir1 data_20170101_k.csv
# 1 root\dir1 data_20170102_k.csv
# 2 root\dir2 data_20170101_k.csv
# 3 root\dir2 data_20170102_k.csv
# Join these into one DataFrame
files = files.join(files_split)
# fullpath path filename
# 0 root\dir1\data_20170101_k.csv root\dir1 data_20170101_k.csv
# 1 root\dir1\data_20170102_k.csv root\dir1 data_20170102_k.csv
# 2 root\dir2\data_20170101_k.csv root\dir2 data_20170101_k.csv
# 3 root\dir2\data_20170102_k.csv root\dir2 data_20170102_k.csv
# Iterate over unique filenames; read CSVs, concat DFs, save file
for f in files['filename'].unique():
paths = files[files['filename'] == f]['fullpath'] # Get list of fullpaths from unique filenames
dfs = [pd.read_csv(path, header=None) for path in paths] # Get list of dataframes from CSV file paths
concat_df = pd.concat(dfs) # Concat dataframes into one
concat_df.to_csv(CONCAT_DIR + f) # Save dataframe
这可以在shell中以非常简单的方式实现,如下所示:
find-名称“*.csv”| xargs cat>mergedCSV
(注意:不要在扩展名中使用.csv,因为它会导致与find不一致。此命令完成后,可以将文件重命名为.csv这可以在shell中以非常简单的方式实现,如下所示:
find.-name“*.csv”| xargs cat>mergedCSV
(注意:不要在扩展名中使用.csv,因为它会导致与find不一致。此命令完成后,文件可以重命名为.csv您可以使用
os.listdir()
或os.walk()
若要循环遍历目录和文件,请使用文件名作为键,数据帧列表作为值,然后使用pd.concat()
将列表合并到一个数据帧中进行输出。@VictorChubukov-从技术上讲,默认值为pd.concat()
正如您所展示的那样,追加dfs是一个不同于合并的操作。如果OP可以澄清预期的结果是合并(列绑定)或追加(行绑定/堆栈),我们可以提供精确的帮助。您可以使用os.listdir()
或os.walk()
若要循环遍历目录和文件,请使用文件名作为键,数据帧列表作为值,然后使用pd.concat()
将列表合并到一个数据帧中进行输出。@VictorChubukov-从技术上讲,默认值为pd.concat()
正如您所展示的,追加dfs是一个不同于合并的操作。如果OP可以澄清预期的结果是合并(列绑定)或追加(行绑定/堆栈),我们可以精确地提供帮助。