итеративно создавайте фрейм данных на пандах с колонкой идентификации на каждой итерации - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь создать большой фрейм данных (main_df), который в конечном итоге будет создан путем добавления строк из нескольких фреймов данных (df_subdir) в нескольких подкаталогах (subdirs), на один уровень ниже основного каталога (main_dir).Другими словами, я должен:

  1. изменить на (каждый из) subdirs
  2. извлечь данные из df_subdir
  3. и добавить строкиdf_subdir до main_df

это должно быть сделано для всех subdirs в main_dir

Учитывая, что мой текущий рабочий каталог уже main_dir и все df_subdirs .xlsx dataframes (столбцы = column1, column2 и column3) находятся непосредственно под subdirs, который расположен ровно на один уровень ниже main_dir, код, который я написал до сих пор, делает это, за исключением того, что Мне нужен дополнительный столбец (column4), который однозначно определяет, какие subdirs данные (строки) поступили из :

import os
import pandas as pd

# initialise my dataframe
main_df = pd.DataFrame(columns=['column1', 'column2', 'column3'])

# start the iteration    
for i in subdirs:
    os.chdir(f'{os.getcwd()}/{i}') # change to each of the subdirectories
    main_df = main_df.append(pd.read_excel('df_subdir.xlsx')) # append the data from df_subdir to main_df

Теперь, учитывая, что имена моих subdirsследуя шаблону типа uniq-identifier_pattern_pattern, я мог бы извлечь uniq-identifier с помощью os.getcwd().split('_')[0]. Это значения, которые я хочу добавить к column4 при каждой итерации.

Я пробовал следующее:

# initialise my dataframe with the extra column4
main_df = pd.DataFrame(columns=['column1', 'column2', 'column3', 'column4'])

for i in subdirs:
    os.chdir(f'{os.getcwd()}/{i}') # change to each of the subdirectories
    main_df['column4'] = os.getcwd().split('_')[0] # specify uniq-identifiers in column4
    main_df = main_df.append(pd.read_excel('name_of_df_subdir.xlsx'))

После этого column4 имеет одно значение, которое является uniq-identifier последней subdirs итерации.

1 Ответ

0 голосов
/ 27 февраля 2019

IIUC вы могли бы использовать dask для этого.

Чтобы прочитать весь файл, вы можете просто запустить

import dask.dataframe as dd

df = dd.read_csv("main_dir/*/*.csv")

где по пути main_dir/*/*.csv main_dir - это верхний каталог, с * между слешами, мы рассматриваем все подкаталоги, а затем *.csv обозначает все CSV в нем.

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

...