Заменить значение в столбце на основе значения в другом столбце - PullRequest
1 голос
/ 09 апреля 2020

У меня есть датафрейм с 3240 строками и 3 столбцами. Столбец Блок представляет блок, в котором появились значения в столбцах А и В. Уникальное количество блоков - 6, но они повторяются последовательно по всему кадру данных от 1 до 6. Значения в column A повторяются в последовательностях exact order от 1-10 во всем кадре данных (блоках). Значения в column B существуют из a-j (n = 10), но они повторяются в random order в последовательностях из a-j, поэтому они никогда не дублируются внутри блока.

Таким образом, в каждом из 6 блоков значения в столбце A (1-10) повторяются в точном порядке от 1 до 10, а в столбце B значения (aj) повторяются в случайном порядке.

Df выглядит следующим образом:

  Block      A    B    ID

    1        1    a    XY
    1        2    b    XY
    1        3    c    XY
    1        4    d    XY
    1        5    e    XY
    1        6    f    XY
    1        7    g    XY
    1        8    h    XY
    1        9    i    XY
    1        10   j    XY
....
    6        1    d    XY
... 
    6        6    j    XY
....
    1        1    g    XX
    1        2    a    XX

Во всем фрейме данных я хотел бы заменить все значения в столбце B на основе соответствующего значения в столбце A для каждого отдельного блока. Логика c будет означать замену значений в столбце B на основе значений в столбце A этим шаблоном 1 = 6, 2 = 7, 3 = 8, 4 = 9, 5 = 10. Результат будет выглядеть так:

  Block      A    B    ID

    1        1    f    XY
    1        2    g    XY
    1        3    h    XY
    1        4    i    XY
    1        5    j    XY
    1        6    a    XY
    1        7    b    XY
    1        8    c    XY
    1        9    d    XY
    1        10   e    XY
....
    6        1    j    XY
...
    6        6    d    XY
....
    1        1    g    XX
    1        2    a    XX

Что будет эффективным для этого?

1 Ответ

2 голосов
/ 09 апреля 2020

Вы хотите идентифицировать блок 5 в каждом блоке 10 и поменять их местами. Это мое решение:

df['B'] = (df.assign(blk_5 = (np.arange(len(df))//5+1) % 2,
                     blk_10 = np.arange(len(df)) // 10
                    )
             .sort_values(['Block','blk_10','blk_5'])
             ['B'].values
          )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...