Чтение одного столбца из csv-файла и переименование с именем текстового файла

#python #pandas #dataframe

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

Вопрос:

Я использую цикл for для циклического просмотра многочисленных текстовых файлов, выбора одного столбца из текстовых файлов (с именем ppm) и добавления этих столбцов в новый фрейм данных. Я бы хотел, чтобы столбцы в новом фрейме данных имели имя текстового файла, но я не уверен, как это сделать..

Мой код:

 all_files=glob.glob(os.path.join(path,"*.txt"))
df1=pd.DataFrame()
for file in all_files:
    file_name = os.path.basename(file)
    df = pd.read_csv(file, index_col=None, sep='s ', header = 0, usecols = ['ppm'])
    df1 = pd.concat([df,df1],axis=1)

 

На данный момент каждый столбец в новом фрейме данных называется ‘ppm’.

Раньше у меня был этот код

 df1=pd.DataFrame()
for file in all_files:
    file_name = file_name = os.path.basename(file)
    df = pd.read_csv(file, index_col=None, sep='s ', header = 0)
    df1[file_name] = df['ppm']
 

Но я столкнулся с предупреждением «Предупреждение о производительности: фрейм данных сильно фрагментирован. Обычно это результат многократного вызова frame.insert, который имеет низкую производительность. Вместо этого рассмотрите возможность объединения всех столбцов сразу с помощью pd.concat(axis=1) . Чтобы получить де-фрагментированный фрейм, используйте newframe = frame.copy() df1[имя_файла] = df[‘ppm’].copy()’ когда я пытался запустить код для большого количества файлов (~ 100s).

Ответ №1:

Предполагая, что индекс равен, добавьте все ваши данные в dictionairy:

 all_files=glob.glob(os.path.join(path,"*.txt"))
data_dict = {}
for file in all_files:
    file_name = os.path.basename(file)
    df = pd.read_csv(file, index_col=None, sep='s ', header = 0, usecols = ['ppm'])
    data_dict[file_name] = df['ppm']
    
df1 = pd.DataFrame(data_dict)
 

Ответ №2:

Используйте concat внешние циклы с добавлением фреймов данных в список с переименованием столбца ppm :

 all_files=glob.glob(os.path.join(path,"*.txt"))

dfs = []
for file in all_files:
    file_name = os.path.basename(file)
    df = pd.read_csv(file, index_col=None, sep='s ', header = 0, usecols = ['ppm'])
    dfs.append(df.rename(columns={'ppm':file_name}))
df_big = pd.concat(dfs, axis=1)
 

Ответ №3:

Используется df.rename() для переименования имени столбца фрейма данных.

 for file in all_files:
    file_name = os.path.basename(file)
    print(file_name)
    df = pandas.read_csv(file, index_col=None, sep=',', header = 0, usecols = ['ppm'])
    df.rename(columns={'ppm': file_name}, inplace=True)
    df1 = pandas.concat([df,df1],axis=1)
 

Вывод:

   two.txt one.txt
0   9   3
1   0   6
 

Ответ №4:

Вместо объединения и добавления фреймов данных при переборе списка файлов вы могли бы рассмотреть возможность создания словаря соответствующих данных, а затем создать свой фрейм данных только один раз. Вот так:

 import csv
import pandas as pd
import glob
import os

PATH = ''
COL = 'ppm'
FILENAME = 'filename'
D = {COL: [], FILENAME: []}
for file in glob.glob(os.path.join(PATH, '*.csv')):
    with open(file, newline='') as infile:
        for row in csv.DictReader(infile):
            if COL in row:
                D[COL].append(row[COL])
                D[FILENAME].append(file)

df = pd.DataFrame(D)
print(df)