Я загружаю файл csv в пандах как

premier10 = pd.read_csv('./premier_league/pl_09_10.csv')

Однако у меня есть 20+ файлов csv, которые я надеялся загрузить как отдельные dfs (один df на csv), используя цикл и предопределенные имена, что-то вроде:

import pandas as pd
file_names = ['pl_09_10.csv','pl_10_11.csv']
names = ['premier10','premier11']
for i in range (0,len(file_names)):
     names[i] = pd.read_csv('./premier_league/{}'.format(file_names[i]))

(Обратите внимание, здесь в качестве примера я привожу только два файла csv) К сожалению, это не работает (сообщений об ошибках нет, но файлы pd dfs не существуют).

Будем очень признательны за любые советы / ссылки на предыдущие вопросы, поскольку я не нашел ничего похожего в Stackoverflow.

0
user1442363 14 Сен 2020 в 17:54

3 ответа

Лучший ответ
  1. Используйте pathlib, чтобы задать путь, p , в файлы
  2. Чтобы найти файлы, соответствующие шаблону
  3. Создайте фрейм данных с pandas.read_csv
    • Используйте понимание словаря, чтобы создать словарь фреймов данных, в котором каждый файл будет иметь свою собственную пару "ключ-значение".
      • Используйте диктовку, как и любой другой диктант; ключи - это имена файлов, а значения - это фреймы данных.
    • В качестве альтернативы используйте понимание списка с помощью {{ X0}}, чтобы создать единый фрейм данных из всех файлов.
  • В for-loop в OP объекты (переменные) не могут быть созданы таким образом (например, names[i]).
    • Это эквивалентно 'premier10' = pd.read_csv(...), где 'premier10' - это тип str.
from pathlib import Path
import pandas as pd

# set the path to the files
p = Path('some_path/premier_league')  

# create a list of the files matching the pattern
files = list(p.glob(f'pl_*.csv'))

# creates a dict of dataframes, where each file has a separate dataframe
df_dict = {f.stem: pd.read_csv(f) for f in files}  

# alternative, creates 1 dataframe from all files
df = pd.concat([pd.read_csv(f) for f in files])  
1
Trenton McKinney 14 Сен 2020 в 18:25

names = ['premier10','premier11'] создает не словарь, а список. Просто замените его на names = dict() или замените names = ['premier10','premier11'] на names.append(['premier10','premier11'])

0
Gustave Coste 14 Сен 2020 в 14:59

Это то, что вы хотите:

#create a variable and look through contents of the directory 
files=[f for f in os.listdir("./your_directory") if f.endswith('.csv')]

#Initalize an empty data frame
all_data = pd.DataFrame()

#iterate through files and their contents, then concatenate their data into the data frame initialized above
for file in files:
   df = pd.read_csv('./your_directory' + file)
   all_data = pd.concat([all_data, df])

#Call the new data frame and verify that contents were transferred
all_data.head()
0
Benjamin Parsons 14 Сен 2020 в 16:34