我有一個包含 csv 檔案的檔案夾,我想回圈它以創建以檔案本身命名的單個 DataFrame。因此,如果我有file_1.csv, file_2.csv, file_3.csv... 我希望為每個檔案創建 DataFrames,并以它包含的資料檔案命名 df。
這是我迄今為止嘗試過的:
# get list of all files
all_files = os.listdir("./Data/")
# get list of only csv files
csv_files = list(filter(lambda f: f.endswith('.csv'), all_files))
# remove file extension to get name only
file_names = []
for i in csv_files:
file = i[:-4]
file_names.append(file)
# create DataFrames from each file named after the corresonding file
dfs = []
def make_files_dfs():
for a,b in zip(file_names, csv_files):
if a == b[:-4]:
a = pd.read_csv(eval(f"'Data/{b}'"))
dfs.append(a)
錯誤代碼:
ParserError: Error tokenizing data. C error: Expected 70 fields in line 7728, saw 74
更新 1
- 使用
chdir代替listdir - 更換
lambda用glob - 使用回應建議的兩個新嘗試
新嘗試1:
path = "./Data/"
os.chdir(path)
csv_files = glob.glob("*.csv")
dataFrameDict = {}
def make_files_dfs():
for a in csv_files:
dataFrameDict[a[:-4] , pd.read_csv(a)]
錯誤代碼:
型別錯誤:不可散列的型別:'DataFrame'
我覺得這需要一行來將 dicts 附加到串列中;會惹它。
新嘗試2:
path = "./Data/"
os.chdir(path)
csv_files = glob.glob("*.csv")
for i in range(len(csv_files)):
globals()[f"df_{i}"] = pd.read_csv(csv_files[i])
錯誤代碼:
ParserError:標記資料時出錯。C 錯誤:第 7728 行預期有 70 個欄位,看到 74
更新 2
- 而不是嘗試創建 DataFrame 串列,而是嘗試創建 DataFrame 字典。正如@Jon Clements 指出的那樣,結果錯誤代碼來自一個檔案,該檔案在一條記錄中包含額外的資料列。
path = "./Data/"
os.chdir(path)
csv_files = glob.glob("*.csv")
csv_names = []
for i in csv_files:
name = i[:-4]
csv_names.append(name)
zip_object = zip(csv_names, csv_files)
df_collection = {}
for name, file in zip_object:
df_collection[name] = pd.read_csv(file, low_memory=False)
uj5u.com熱心網友回復:
您的代碼有點難以理解。你有一些不必要的功能。首先,更改作業目錄路徑更容易(通過os.chdir(path)。其次,您可以擺脫 lambda 函式并使用glob.glob。最后,您不能創建以變數命名的 DataFrame。您的dfs串列將包含一些獲勝的類名不會讓您深入了解 DataFrame。使用字典要好得多。總的來說,您的代碼如下所示:
import os
import glob
path = "the path to your data"
os.chdir(path)
# get list of only csv files
csv_files = glob.glob("/*.csv")
# create a dictionary with key as the DF name and values as DataFrames
dataFrameDictionary={}
def make_files_dfs():
for a in csv_files:
dataFrameDictionary[a[:-4], pd.read_csv(a)]
uj5u.com熱心網友回復:
我不明白為什么您的代碼如此冗長,但這可以通過以下方式完成:
csv_list = ['file_1.csv', 'file_2.csv', 'file_3.csv']
for i in range(len(csv_list)):
globals()[f"df_{i}"] = pd.read_csv(csv_list[i])
輸出:
將創建三個資料框。df_1 將在串列中包含第一個檔案,df_2 將在串列中包含第二個檔案,依此類推。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/376571.html
