#python #python-3.x #pandas #numpy
#python #python-3.x #pandas #numpy
Вопрос:
У меня есть несколько каталогов с файлами внутри (индекс), у каждого каталога есть состояние. Я хочу перебрать все файлы из каталога, создать для каждого 2D гистограмму и объединить все в один объект с возможностью выбора строк на основе состояния.
Например (с 2D-гистограммой 3×3):
"Filename" , "State", "X_1", "X_2", "X_3", "X_4", "X_5", "X_6", "X_7", "X_8","X_9"
"File_1.csv", "FOO",0,0,1,2,3,0,0,0,0
"File_2.csv", "FOO",0,0,1,2,3,1,1,0,0
"File_3.csv", "FOO",0,0,4,5,3,0,0,0,0
"File_4.csv", "BAr",0,0,1,2,3,0,0,0,0
"File_5.csv", "BAR",0,0,1,2,3,1,1,0,0
"File_6.csv", "BAR",0,0,4,5,3,0,0,0,0
Я сделал:
def read(path, b, State):
HistList = []
HistName = []
files = os.listdir(path)
for i in range(0, len(files)):
....
hist,xe,ye = np.histogram2d( X, Y, bins=b, normed=True)
HistList.append( hist.flatten() )
NameList.append(files[i])
return DataFrame( ??? )
Комментарии:
1. Возможно, я не понял вопроса, но не
Mat.append(h)
(сразу после последней строки в цикле) обращается к этому? Какова форма конечной матрицы?
Ответ №1:
Почему не использовать словарь?
Вы можете создать Final_Dict{}
, чтобы передать его функции в качестве аргумента, и функция постепенно дополнит этот словарь для каждой папки и ее файлов. В этом словаре основные ключи представляют папку ( Final_Dict[folder_name]
). Затем вложенные ключи этого основного ключа предназначены для имен файлов этой конкретной папки ( Final_Dict[folder_name][file_name]
) и, наконец, значением этого вложенного ключа является гистограмма.
Просто для ясности, следующая строка извлекает имя папки из пути:
current_folder = os.path.basename(os.path.normpath(path))
Код (не тестировался):
def read(Final_Dict, path, b, para):
current_folder = os.path.basename(os.path.normpath(path))
Final_Dict[current_folder] = {}
files = os.listdir(path)
for i in range(0, len(files)):
....
hist,xe,ye = np.histogram2d( X, Y, bins=b, normed=True)
Final_Dict[current_folder][files[i]] = hist.flatten()
return Final_Dict
Final_Dict = {}
b = ...
para = ...
for folder_path in folder_path_list:
Final_Dict = read(Final_Dict, folder_path, b, para)
После этого вы можете преобразовать Final_Dict во фрейм данных:
Final_Dataframe = pd.DataFrame.from_dict(Final_Dict, orient='index', dtype=None)
краткий пример преобразования:
import numpy as np
import pandas as pd
Final_Dict= {}
Final_Dict['state1'] = {}
Final_Dict['state2'] = {}
Final_Dict['state1']['file1'] = [1,2,3]
Final_Dict['state1']['file2'] = [9,9,9]
Final_Dict['state2']['file1'] = [3,3,3]
Final_Dict['state2']['file2'] = [7,6,5]
FInal_Dataframe = pd.DataFrame.from_dict(Final_Dict, orient='index', dtype=None)
print "whole dataframe:"
print FInal_Dataframe
print "nnnSelecting folder 2: "
print FInal_Dataframe.loc['state2']
Результат :
whole dataframe:
file2 file1
state1 [9, 9, 9] [1, 2, 3]
state2 [7, 6, 5] [3, 3, 3]
Selecting folder 2:
file2 [7, 6, 5]
file1 [3, 3, 3]
Name: state2, dtype: object
Комментарии:
1. в моем случае [1,2,3] представляет собой массив numpy формы (56,10,10) — есть ли способ привести каждую запись с именем ‘X_i’ в виде столбца?
2. Я не понимаю. Теперь столбцы — это имена файлов, разве они вам не нужны? Объясните более четко
3. @Roby Но все же мое решение кажется правильным для вашего вопроса. Пожалуйста, ответьте на этот вопрос: — Содержит ли каждый «файл» «несколько» гистограмм?
4. нет, каждый файл содержит ровно одну гистограмму. В вашем примере я хочу создать матрицу (в результате) Final_DataFrame[ Final_DataFrame[‘file2’] == «folder1»;] — возможен ли чат?
5. @Roby итак, тогда мое решение — это то, что вы хотите. [1,2,3] — это гистограмма. Например, гистограмма файла 1, который находится в папке 2, равна [3,3,3]. И FInal_Dataframe.loc[‘state2’] выбирает файлы только во второй папке