导入文件夹中存在的所有 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)
我在一个目录中有大约 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)