Я новичок в pandas, пробовал просматривать документы и экспериментировать с различными примерами, но эта проблема, с которой я столкнулся, действительно поставила меня в тупик.
У меня есть два следующих кадра данных (DataA / DataB), который я хотел бы объединить на основе global_index / item / values.
DataA DataB
row item_id valueA row item_id valueB
0 x A1 0 x B1
1 y A2 1 y B2
2 z A3 2 x B3
3 x A4 3 y B4
4 z A5 4 z B5
5 x A6 5 x B6
6 y A7 6 y B7
7 z A8 7 z B8
Список элементов (item_ids) конечен, и каждый из двух информационных фреймов представляет собой значение признака ( черта A, черта B) для элемента с данным значением global_index.
Глобальный индекс может грубо рассматриваться как единица «времени»
Отображение между каждым кадром данных (DataA / DataB), и global_index выполняется с помощью следующих двух DF преобразователя:
DataA_mapper
global_index start_row num_rows
0 0 3
1 3 2
3 5 3
DataB_mapper
global_index start_row num_rows
0 0 2
2 2 3
4 5 3
Проще говоря, для данного global_index (например: 1) преобразователь определит список строк в соответствующих DF (DataA или DataB). ), которые связаны с этим global_index.
Например, для значения global_index 0:
- В DF DataA строки 0..2 связаны с global_index 0
- в DF Строки DataB 0..1 связаны с global_index 0
Другой пример, для значения global_index 2:
- В DF DataB строки 2..4 связаны с global_index 2
- В DF DataA нет строк, связанных с global_index 2
Представленные диапазоны [start_row, start_row + num_rows) не перекрывают друг друга и представляют уникальную последовательность / диапазон строк в соответствующих им фреймах данных (DataA, DataB)
Короче говоря, ни одна строка в DataA или DataB не будет найдена в более чем одном диапазоне.
Я хотел бы объединить DF, чтобы я получил следующий фрейм данных:
row global_index item_id valueA valueB
0 0 x A1 B1
1 0 y A2 B2
2 0 z A3 NaN
3 1 x A4 B1
4 1 z A5 NaN
5 2 x A4 B3
6 2 y A2 B4
7 2 z A5 NaN
8 3 x A6 B3
9 3 y A7 B4
10 3 z A8 B5
11 4 x A6 B6
12 4 y A7 B7
13 4 z A8 B8
В окончательном фрейме данных любая пара из global_index / item_id будет либо:
- a значение как для значения A, так и для значения B
- значение только для значения A
- значение только для значения B
При условии, что для данного заданного значения имеется только одно значение global_index / item (например: valueA, но нет valueB) для последнего значения отсутствующего, которое будет использоваться.