Используйте Switch / Case Statement для построения DF2, перебирая строки в DF1 - PullRequest
0 голосов
/ 17 апреля 2020

Я загрузил данные из файла с разделителями табуляции в DF. Данные вкладки - это форма, заполненная шаблоном.

Критическая концепция заключается в том, что переменное число строк составляет одну запись в форме. В DF1 ниже каждый раз, когда индекс равен «A», начинается новая запись. Поэтому код должен будет перебирать строки, чтобы перестраивать каждую запись в DF2. Каждая запись будет представлена ​​как одна строка в DF2.

На основе того факта, что каждая строка «A» в DF1 начинает новую запись формы (и соответствующую строку в DF2), мы можем видеть в DF1 ниже, есть только две записи в моем примере, и будет только две строки в DF2. Также важно: в каждой строке содержится разное количество фрагментов данных (столбцов). Z имеет 2 (тогда NA), A имеет 3, B имеет 4.

Все это необходимо сопоставить с DF2 в зависимости от индексных букв Z, A, B (обратите внимание, что индексных букв больше, но это для этого примера упрощенно).

DF 1

-  A    B  C   D
Z xyz  5   NA  NA
A COA  aa  bb  NA
B RE   01  02  03
B DE   04  05  06
A COB  dd  ee  NA
B RE   01  02  03
B DE   04  05  06

В прошлом я делал подобные вещи в VBA и использовал бы оператор CASE для преобразования данных. Я нашел хорошее начало использования словарей в этой теме:

Замены для оператора switch в Python?

Один пример кода в приведенной выше теме предлагает использовать словарь типа case case:

return{
    'a': 1,
    'b': 2,
}[x]

Кажется, что это будет работать, хотя я не уверен, как выполнить на практике. Кроме того, для каждого A, B и т. Д. c, указанного выше, мне нужно вывести несколько инструкций в зависимости от буквы индекса. По большей части, инструкции, где сопоставить в DF2. Например, в моем:

Индекс A:
Отображение столбца A в DF2.iloc[1]['B']
Отображение столбца B в DF2.iloc[1]['C']
Отображение столбца C в DF2.iloc[1]['D']

Указатель B:
Будет четыре инструкции, аналогичные приведенным выше.

DF2 будет выглядеть так:

-    A    B     C    D    E   F   G    H    I    J    K    L
1   xyz  COA   aa   bb   RE   01  02  03    DE   04   05   06
2   xyz  COB   dd   ee   RE   01  02  03    DE   04   05   06

Таким образом, для каждой строки в DF1 выполняется различное количество инструкций в зависимости от на «индексном письме». Все инструкции указывают код, куда помещать данные в DF2. Инструкция отображения для каждой отдельной буквы индекса всегда будет одинаковой для столбцов, будет изменяться только строка ( некоторый тип счетчика при перемещении из одной группы записей в другую в DF2).

Как я могу обработать различное количество инструкций для каждого типа букв алфавита в формате типа переключатель / регистр?

Спасибо

1 Ответ

1 голос
/ 17 апреля 2020

Я думаю, вы можете использовать:

#filter only 2,3 index rows
df1 = df[df.index.isin([2,3])].copy()
#create new column for same value if 2 in index
df1['new'] = np.where(df1.index == 2, 'Z', df1.A)
#create groups by compare 2
df1['g'] = (df1.index == 2).cumsum()
#convert columns to index and reshape, then change order
df1 = (df1.set_index(['g','new']).unstack()
          .swaplevel(0,1, axis=1)
          .sort_index(axis=1, ascending=[False, True]))
#default columns names
df1.columns = range(len(df1.columns))
print (df1)
     0   1   2   3  4   5   6    7  8    9  10  11
g                                                 
1  ABC  aa  bb  cc  R  01  02  NaN  D  NaN  03  04
2  DEF  dd  ee  ff  R  01  02  NaN  D  NaN  03  04
...