Импорт данных (изменение формы, numpy, pandas)

#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’] выбирает файлы только во второй папке