Выполните функцию в списке кадров данных, каждый раз удаляя один кадр. Подход складным ножом

#python #pandas #dataframe #loops

Вопрос:

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

Как я могу создать цикл, который каждый раз удаляет один кадр данных и вычисляет мою функцию fd?

вот как были созданы блоки:

 def create_blocks(dataframe, block_size):  blocks = list()  numberofblocks = math.ceil(len(df) / block_size)  for i in range(numberofblocks):  blocks.append(df[i*block_size:(i 1)*block_size])  print(f'data was split into {len(blocks)} blocks, consisting of {block_size} lines each')  return blocks  

Затем я выполняю функцию для всех блоков / фреймов данных в списке в среднем, fd здесь просто функция, которая выполняет некоторую математику для столбцов m, r, c и z:

 def jackknife(blocks):  list_of_fds =[]  for section in blocks:  thefd = (fd(section['m'], section['r'], section['c'], section['z']))  list_of_fds.append(thefd)  mean_of_thefd = statistics.mean(list_of_thefd)  print(f'Mean of the fd = {mean_of_fd}')  return mean_of_fd  

Это работает, и я получаю среднее значение, которое было рассчитано по всем кадрам данных в списке, он же блоки.

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

 for i in range(len(blocks)):  if section!=blocks[i]:  jk_fd = (fd(section['m'], section['r'], section['c'], section['z']))  

это не работает, я получаю ошибку значения, я также пытался:

 for section in blocks:  jk_block = blocks.remove(section)  jk_fd = (fd(jk_block['m'], jk_block['r'], jk_block['c'], jk_block['z']))    

Тоже не сработало.

Я был бы очень признателен за помощь, спасибо.

Комментарии:

1. 2 причины, по которым ваш код не выполняет то, что вы ожидаете: (1) == / != между 2 кадрами данных создается другой кадр данных или a ValueError (в случае несоответствия меток), а не True / False . Используйте df1 is df2 или df1.equals(df2) вместо этого, в зависимости от того, что вам нужно. (2) list.remove работает на месте и возвращается None .

2. ах, спасибо, что помогли!