导入文件夹中存在的所有 csv 文件并根据它们的名称对它们进行分组?

Import all csv files existing in a folder and group them based on their names?

我在一个目录中有大约 1000 个 csv 文件,其中每 4 个具有相同的名称,但末尾的编号不同。例如:

ABC_0.csv 
ABC_1.csv 
ABC_2.csv 
ABC_3.csv  
...
DIJ_0.csv
DIJ_1.csv
DIJ_2.csv
DIJ_3.csv

我可以将它们全部导入并将每个文件放在自己的数据框中,这样我就有了一个数据框列表 LIST_DATA。但我想根据名称自动对每 4 个数据帧进行分组。 因此,我会将 ABC 文件放在数据帧列表 LIST_ABC 和 DIJ 数据帧列表 LIST_DIJ 中。 或者,如果可能的话,也许可以将他们的名字添加为一列,我可以在其中使用名称列过滤数据框?

这是我目前所拥有的:

import os
import glob

path1 = 'D:\folder'

all_files1 = glob.glob(path1 + "/*.csv")
all_files1.sort(key=os.path.getmtime)
List_DATA = []

for filename in all_files1:
    data = pd.read_csv(filename, index_col=None)  
    List_DATA.append(data)

您可以通过这种方式读取所有csv文件(文件将包含csv文件的所有路径):

import os
files = []
List_DATA = []
os.chdir("D:\folder")
# Add the path of csv folder
for i in os.listdir("D:\folder"):
    if i.endswith('.csv'):
        files.append(i)
files.sort(key=os.path.getmtime)

然后您可以继续您的代码:

for filename in files:
    data = pd.read_csv(filename, index_col=None)  
    List_DATA.append(data)

如果我没理解错的话,你可以试试这样的方法:

首先创建一个字典,其键是 commun 中的前缀(例如:'ABC'),值是一个列表,其中包含对应于每个以键为前缀的 csv 的数据框。

然后合并它们

import os
import glob
import pandas as pd
path1 = 'D:\folder'

all_files1 = glob.glob(path1 + "/*.csv")
all_files1.sort(key=os.path.getmtime)

all_data = {}


for filename in all_files1:
    name = os.path.basename(filename).split('csv')[0]
    if name in all_data:
        all_data[name].append(pd.read_csv(filename, index_col=None))
    else:
        all_data[name] = [pd.read_csv(filename, index_col=None)]

list_data = []
for k,v in all_data.items():
    list_data.append((k, pd.concat(v, axis=1)))

首先,我想说的是,我的解决方案之所以可靠,是因为总是有 4 个文件归为一组,并且不会遗漏任何内容。如果你想让它更健壮,应该使用文件名解析。

据我了解,您希望从四个具有相同字符串前缀的 csv 文件中获取数据,这些文件组合在一个列表中。然后将其嵌入到更大的列表中,其中包含 1000 个文件中的所有数据。 因此,我不会按时间戳排序,而是按名称排序,然后简单地将文件存储在列表中,这些文件在添加四个项目并随后重置后添加到更大的列表中。这是我的代码:

import os
import glob
import pandas as pd

path1 = 'D:\folder'
    
all_files1 = glob.glob("*.csv")
# Sort by name not timestamp
all_files1.sort()
List_DATA = []
# For Storing sub list of data frames
SubList_DATA = []
        
for idx,filename in enumerate(all_files1):
    data = pd.read_csv(filename, index_col=None)  
    SubList_DATA.append(data)
    # Every 4th time the sublist gets stored in main list and reset. 
    if idx%4==3:
        List_DATA.append(SubList_DATA)
        SubList_DATA = []

编辑: 我刚刚破解了一个使用文件名的版本,即使组中有更多或更少的文件也能正常工作:

import os
import glob
import pandas as pd

path1 = 'D:\folder'

all_files1 = glob.glob("*.csv")
# Sort by name not timestamp
all_files1.sort()
List_DATA = []
# For Storing sub list of data frames
SubList_DATA = []
# For keeping track which sublist is generated.
currentprefix = ""

for idx,filename in enumerate(all_files1):
    # Parse prefix string from filename 
    prefix, suffix = filename.split("_")
    # Since sorted the prefix should be change only once and nether reappear
    if currentprefix != prefix:
        # Skip this at the first step
        if idx != 0:
            # Add sublist to major one and reset it
            List_DATA.append(SubList_DATA)
            SubList_DATA = []
        # Set current prefix to the current block of read in files
        currentprefix = prefix
    # Add data to sublist
    data = pd.read_csv(filename, index_col=None)
    SubList_DATA.append(data)

# Finally add last sublist
List_DATA.append(SubList_DATA)