Как выполнить те же манипуляции pandas с пакетом CSV-файлов

#python #pandas #dataframe #csv

#python #pandas #фрейм данных #csv

Вопрос:

Я запускаю следующий код для отдельных файлов CSV:

 import pandas as pd

header_names = ['column1', 'column2', 'column3', 'column4', 'column5', 'column6']

df = pd.read_csv('some.csv', delimiter= "|", skiprows=1, names=header_names)

df['column2'].replace(['bad', 'worse'],['good', 'better'],inplace =True)

df.to_csv('new.csv', index=False)
  

Как я могу запустить этот код для пакета файлов вместо изменения кода для каждого имени файла?

Редактировать: если все файлы CSV, которые я хочу изменить, находятся в одной папке, это упростит задачу?

Комментарии:

1. вы хотите добавить весь CSV в new.csv?

2. используйте glob, чтобы получить список файлов CSV, затем выполните итерацию по нему

3. Есть два простых способа. Вы можете получить список файлов, а затем выполнить цикл по ним. Вы также можете использовать Dask для одновременного чтения всех файлов, а затем выполнить манипуляцию один раз.

4. @gtomer Мне нужно изменить существующие CSV-файлы, а затем сохранить измененный CSV-файл в качестве нового файла

Ответ №1:

Запуск этой логики для нескольких файлов:

 import os
import pandas as pd

def my_function(source_file, target_suffix):
    header_names = ['column1', 'column2', 'column3', 'column4', 'column5', 'column6']    
    df = pd.read_csv(source_file, delimiter= "|", skiprows=1, names=header_names)    
    df['column2'].replace(['bad', 'worse'],['good', 'better'],inplace =True)
    # Generating output file name based on the input file name, and the provided suffix
    target_file = source_file.replace('.csv', '')   '_output_'   str(target_suffix)   '.csv' 
    df.to_csv(target_file, index=False)

# Define list of input_file    
file_names = []

# Set the directory of your files
directory = os.path.join("c:\","path")
# Locate the input csv file
for root,dirs,files in os.walk(directory):
    for file in files:
       if file.endswith(".csv"):
           file_names.append(file)

# Looping on the input file names and their indexes using enumerate
for i, source_file in enumerate(file_names):
    # Call the function on the file name, and passing file index as the suffix
    my_function(source_file, i)
  

Комментарии:

1. Могу ли я импортировать папку, чтобы мне не нужно было вводить имя каждого файла .csv, который я хочу изменить, а также имя вывода?

2. @canigan обновил код, теперь он находит входные CSV-файлы и выводит их с уникальными именами

Ответ №2:

Как ответили gtomer и Aviv Yaniv, я хотел бы расширить этот ответ, как вы собираетесь получить имя файлов, которые находятся в вашем целевом каталоге. Вы можете использовать следующий код, чтобы получить имена файлов csv в каталоге.

 csv_files=[]
import os 
directory=os.path.join("Path to the directory")
for root,dirs,files in os.walk(directory):
    for file in files:
        if file.endswith(".csv"):
            print(file)
            csv_files.append(pd.read_csv(file,error_bad_lines=False))
  

и вы можете запустить свою логику внутри цикла for, перебирающего каждый файл.

Ответ №3:

Вы можете переключаться между вашими файлами:

 files = ['file1.csv','file2.csv','file3.csv']
agg_df = pd.DataFrame()
for file in files:
    df = pd.read_csv(file, delimiter= "|", skiprows=1, names=header_names)
    df['column2'].replace(['bad', 'worse'],['good', 'better'],inplace =True)
    agg_df = agg_df.append(df)
agg_df.to_csv('new.csv', index=False)
  

Ответ №4:

 import pandas as pd
import dask.dataframe as dd

header_names = ['column1', 'column2', 'column3', 'column4', 'column5', 'column6']

df = dd.read_csv("./directory/*.csv", delimiter= "|", skiprows=1, names=header_names)
df['column2'] = df['column2'].replace(['bad', 'worse'],['good', 'better'])
df.to_csv("./directory/export-*.csv")
  

Существует множество способов изменить имя экспорта. * в read_csv будет считываться все файлы с окончанием .csv. * на to_csv будет нумеровать все разные файлы, когда они будут экспортированы. Нет необходимости использовать циклы for с использованием этого метода.

Комментарии:

1. Я действительно хочу попробовать это, но у меня не установлен dask, и когда я пытаюсь его установить, я продолжаю получать ошибку разрешения на запись, поэтому мне придется попробовать решение, которое не связано с этим