Возникла сложная проблема, которую я не мог осмыслить последние несколько дней.
Учитывая следующее DF,

Я хочу закончить с:

По сути, мы смотрим в столбец 'user_entry_note', чтобы увидеть, когда определенные фрагменты данной последовательности были успешно введены в порядок.
Чтобы получить фрагменты из последовательности, я использую следующую функцию:
def get_chunks_from_seq(seq_id):
tidy = tidy_string(seq_id)
'work out for all the possible chunks'
# work out the chunks
ord_chunks = [tidy[i:j] for i, j in itertools.combinations(range(len(tidy)+1), 2)]
return(ord_chunks)
, который возвращает список всех возможных кусков по порядку.
Теперь я изо всех сил стараюсь достичь разных целей без использования большого количества информационных кадров. Я думаю, что я могу упустить трюк с самого начала процесса.
Здесь "seq" - исходная последовательность, "куски" - компоненты этой последовательности. Вся последовательность также становится частью второго этапа.
Для каждого «чанка» я хочу знать, что trial_ms был «завершен» (воспроизведен в порядке, переходящем вниз по столбцу «user_entry_note»), а также значения в элементе entry_error_no, userentries_plybs на этом этапе.
Мне удалось добиться этого с помощью:
# get a list of the possible chunks based on the sequence
chunks = get_chunks_from_seq(df1['seq'][0])
# create df of chunks and their completion indexes
h = [find_idx(seq, df1, 'user_entry_note') for seq in chunks]
# list of the chunks themselves
h2 = [seq for seq in chunks]
# column of chunk lens
h3 = [len(seq) if isinstance(seq, list) is True else 1 for seq in chunks]
# create strings of these
h2_str = []
for p in h2:
if type(p) == list:
p = list_to_string(p)
h2_str.append(p)
else:
h2_str.append(str(p))
# make df to format them
df1_2 = pd.DataFrame({'chunk_idx__completion_in_trial': h,'chunk': h2_str,'chunk_len': h3 })
# sub df
subdf1 = ['user_id','timecode','user_entries_error_no', 'user_entries_plybs']
df1_3 = df1.iloc[h,:][subdf1].reset_index()
#tie everything together
keep = ['chunk','user_id','timecode','user_entries_error_no','user_entries_plybs']
df2 = df1_2.join(df1_3)[keep]
Однако я думаю, что мне нужно отказаться от этого подхода, чтобы достичь своей второй цели, в которой я сбился с толку.
В дополнение к этому я хочу знать, когда каждая нота в чанке была пропущена (trial_ms) когда этот чанк был пропущен (но не тогда, когда эти заметки могли появляться раньше).
Другими словами, в следующем примере:

для фрагмента "40-30", n1 будет 7, n2 будет индексом 8, потому что блок был завершен в 8. Не имеет значения, что 40 появилось в индексе 2. Однако индекс 2 будет правильным индексом для n1 фрагмента "40", который также будет равен столбцу "chunk_completed" в этом случае (и для всех фрагментов, где n = 1)
Воспроизводимый DF:
f = {'seq': {0: '60-40-30',
1: '60-40-30',
2: '60-40-30',
3: '60-40-30',
4: '60-40-30',
5: '60-40-30',
6: '60-40-30',
7: '60-40-30',
8: '60-40-30'},
'seq_len': {0: 3, 1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 7: 3, 8: 3},
'seq_list': {0: [60, 40, 30],
1: [60, 40, 30],
2: [60, 40, 30],
3: [60, 40, 30],
4: [60, 40, 30],
5: [60, 40, 30],
6: [60, 40, 30],
7: [60, 40, 30],
8: [60, 40, 30]},
'trial_ms': {0: -9223372037,
1: -18963961,
2: 31992270,
3: -13028311,
4: -18963961,
5: 31992270,
6: -13028311,
7: -18963961,
8: 31992270},
'user_entries_error_no': {0: 1,
1: 2,
2: 6,
3: 2,
4: 3,
5: 3,
6: 3,
7: 2,
8: 4},
'user_entries_plybs': {0: 2, 1: 3, 2: 3, 3: 2, 4: 3, 5: 3, 6: 1, 7: 1, 8: 4},
'user_entry_note': {0: 23,
1: 60,
2: 40,
3: 30,
4: 40,
5: 3,
6: 3,
7: 2,
8: 4},
'user_id': {0: 'seb',
1: 'seb',
2: 'seb',
3: 'seb',
4: 'seb',
5: 'seb',
6: 'seb',
7: 'seb',
8: 'seb'}}
df1 = pd.DataFrame().from_dict(f)