Как сгруппировать два столбца при назначении «агрегированных» столбцов новым столбцам?

Я использую Python, и мне нужно «агрегировать» столбцы «R», а затем «J», чтобы для каждого R каждая строка была уникальной «J».

Я не хочу терять данные в C, поэтому мне нужно создать новые столбцы с именами C1 для T=1, C2 для T=2 и C2 для T=3, которые записывают соответствующие данные из C в C1, C2 или C3 с использованием T.

Итак, мне нужно перейти от:

#______________            _______________________________
#| R  J  T  C |           |# R  J  C(T=1)  C(T=2)  C(T=3)|
#| a  1  1  x |           |# a  1    x        y       z  |
#| a  1  2  y |           |# b  1    w                   |  
#| a  1  3  z |  ----->   |# b  2    v                   | 
#| b  1  1  w |           |# b  3    s                   |
#| b  2  1  v |           |# c  1    t        r          |
#| b  3  1  s |           |# c  2    u                   |
#| c  1  1  t |           |______________________________|
#| c  1  2  r |           
#| c  2  1  u |
#|____________|

data = {'R': ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'], 
        'J': [1, 1, 1, 1, 2, 3, 1, 1, 2], 
        'T': [1, 2, 3, 1, 1, 1, 1, 2, 1], 
        'C': ['x', 'y', 'z', 'w', 'v', 's', 't', 'r', 'u'] }

df = pd.DataFrame(data=data)

PS. Если это поможет, столбцы J и T имеют дополнительный столбец с уникальными идентификаторами.

J_ID = [1,1,1,2,3,4,5,5,6]
T_ID = [1,2,3,4,5,6,7,8,9]

Любая помощь будет принята с благодарностью.


person nielsen    schedule 17.04.2020    source источник
comment
опубликовать данные в виде кода, чтобы люди могли вставить их в свою IDE   -  person gold_cy    schedule 17.04.2020


Ответы (1)


Вы можете использовать groupby, а затем преобразовать столбец C в список, а затем в Series.

(
    df.groupby(['R','J'])
    .apply(lambda x: x.C.tolist()).apply(pd.Series)
    .rename(columns=lambda x: f'C{x+1}')
    .reset_index()
)


    R   J   C1  C2  C3
0   a   1   x   y   z
1   b   1   w   NaN NaN
2   b   2   v   NaN NaN
3   b   3   s   NaN NaN
4   c   1   t   r   NaN
5   c   2   u   NaN NaN
person Allen    schedule 17.04.2020
comment
Есть возможности для повышения производительности за счет простоты, если OP имеет большой набор данных. - person Allen; 17.04.2020
comment
Жаль, что explode не принимает аргумент, следует ли взорваться по строкам или по столбцам. - person timgeb; 17.04.2020
comment
@Allen Это определенно решило проблему, которую я представил. Мой набор данных достаточно мал для решения, но в нем больше столбцов, чем показано. А что, если бы у каждого R было несколько столбцов с характеристиками (одинаковые значения для каждого R) и было бы более одного столбца, такого как C, который нуждался бы в той же обработке, что и C? - person nielsen; 17.04.2020