【问题标题】:Merge multiple csv files with same name in 10 different subdirectory在 10 个不同的子目录中合并多个具有相同名称的 csv 文件
【发布时间】:2017-05-13 00:23:56
【问题描述】:

我在每个目录中有 10 个具有相同文件名的不同子目录(每个目录 20 个文件),第 0 列是每个文件中的索引列。

例如

     **strong text**DIRECTORY  A
    - data_20170101_k.csv
    - data_20170102_k.csv
    - data_20170102_k.csv
    - data_20170103_k.csv
    - data_20170104_k.csv
    - data_20170105_k.csv
    .....
    .....
    - data_20170120_k.csv  



    **DIRECTORY  B**
    - data_20170101_k.csv
    - data_20170102_k.csv
    - data_20170102_k.csv
    - data_20170103_k.csv
    - data_20170104_k.csv
    - data_20170105_k.csv
    .....
    .....
    - data_20170120_k.csv                




    **DIRECTORY  C**
    - data_20170101_k.csv
    - data_20170102_k.csv
    - data_20170102_k.csv
    - data_20170103_k.csv
    - data_20170104_k.csv
    - data_20170105_k.csv
    .....
    .....
    - data_20170120_k.csv                


   Each of the above files contains 6 columns and index_col = 0  with NO
   column headers

   **DIRECTORY  FILES_MERGED**
   - data_20170101_k.csv
   - data_20170102_k.csv
   - data_20170102_k.csv
   - data_20170103_k.csv
   - data_20170104_k.csv
   - data_20170105_k.csv
   .....
   .....
   - data_20170120_k.csv

我想合并每个子目录中具有相同名称的所有文件 进入 1 个具有相同名称的文件并将新文件保存在新的子目录中 例如 DIRECTORY FILES_MERGED with INDEX = Column 0. 合并文件 每个文件中只有一个索引列包含 1,2,3,4,5 列 每个目录的同名

我已将 csv 文件读入 pandas 数据帧

   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 

【问题讨论】:

  • 您可以使用os.listdir()os.walk() 循环目录和文件,使用文件名作为键和数据框列表作为值创建dict,然后pd.concat() 进行合并将列表放入一个数据帧中以供输出。
  • @VictorChubukov - 从技术上讲,pd.concat() 的默认设置是为 dfs 附加一个不同于合并的操作。如果 OP 可以明确预期的结果是合并(列绑定)或追加(行绑定/堆栈),我们可以提供准确的帮助。

标签: python csv pandas


【解决方案1】:

有很多方法可以做到这一点,留在熊猫我做了以下。

与文件结构

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

【讨论】:

    【解决方案2】:

    这可以在 shell 中以非常简单的方式实现:

    find . -name "*.csv" | xargs cat > mergedCSV
    

    (注意:不要在扩展名中使用.csv,否则会导致与find不一致。此命令完成后,文件可以重命名为.csv

    【讨论】:

    猜你喜欢
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    相关资源
    最近更新 更多