#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)