Pandas: импортировать несколько файлов csv в dataframe, используя цикл и иерархическую индексацию

Я хотел бы прочитать несколько CSV файлов (с различным количеством столбцов) из целевого каталога в один Python Pandas DataFrame для эффективного поиска и извлечения данных.

Файл примера:

Events 
1,0.32,0.20,0.67
2,0.94,0.19,0.14,0.21,0.94
3,0.32,0.20,0.64,0.32
4,0.87,0.13,0.61,0.54,0.25,0.43 
5,0.62,0.21,0.77,0.44,0.16

Вот что я до сих пор:

# get a list of all csv files in target directory
my_dir = "C:\\Data\\"
filelist = []
os.chdir( my_dir )
for files in glob.glob( "*.csv" ) :
    filelist.append(files)

# read each csv file into single dataframe and add a filename reference column 
# (i.e. file1, file2, file 3) for each file read
df = pd.DataFrame()
columns = range(1,100)
for c, f in enumerate(filelist) :
    key = "file%i" % c
    frame = pd.read_csv( (my_dir + f), skiprows = 1, index_col=0, names=columns )
    frame['key'] = key
    df = df.append(frame,ignore_index=True)

(индексирование работает неправильно)

По существу, script ниже - это именно то, что я хочу (проверенный и проверенный), но должен быть зациклен через 10 или более файлов csv:

df1 = pd.DataFrame()
df2 = pd.DataFrame()
columns = range(1,100)
df1 = pd.read_csv("C:\\Data\\Currambene_001y09h00m_events.csv", 
                  skiprows = 1, index_col=0, names=columns)
df2 = pd.read_csv("C:\\Data\\Currambene_001y12h00m_events.csv", 
                  skiprows = 1, index_col=0, names=columns)
keys = [('file1'), ('file2')]
df = pd.concat([df1, df2], keys=keys, names=['fileno'])

Я нашел много связанных ссылок, однако я все еще не могу заставить это работать:

Ответ 1

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

  • Предполагая, что каждый столбец из каждого файла отличается и добавляет цифры в столбцы с похожими именами в файлах, если необходимо, чтобы они не смешивались;
  • Элементы, относящиеся к одному и тому же индексу строки, хранятся рядом друг с другом под соответствующими столбцами.

Эффект эффективного добавления заключается в том, чтобы опрокинуть файлы сбоку, так что вы получите желаемое поведение в соответствии с тем, что будет делать pandas.concat. Это мой рецепт:

from pandas import *
files = !ls *.csv # IPython magic
d = concat([read_csv(f, index_col=0, header=None, axis=1) for f in files], keys=files)

Обратите внимание, что read_csv транспонируется с помощью axis=1, поэтому он будет конкатенироваться по оси столбца, сохраняя его имена. Если вам нужно, вы можете перенести полученный DataFrame с помощью d.T.

EDIT:

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

def reader(f):
    d = read_csv(f, index_col=0, header=None, axis=1)
    d.columns = range(d.shape[1])
    return d

df = concat([reader(f) for f in files], keys=files)