#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 кадрами данных создается другой кадр данных или aValueError
(в случае несоответствия меток), а неTrue
/False
. Используйтеdf1 is df2
илиdf1.equals(df2)
вместо этого, в зависимости от того, что вам нужно. (2)list.remove
работает на месте и возвращаетсяNone
.2. ах, спасибо, что помогли!