Pandas: выберите строки и добавьте справа в виде нескольких наборов столбцов (изменить форму?) - PullRequest
0 голосов
/ 23 апреля 2020
df = pd.DataFrame({
    'pid': [10,20,10,30], 
    'sid': [1,1,2,3],
    'data1': ['a','b','a','c'],
    'data2': ['q','w','e','e'],
})

   pid  sid data1 data2
0   10    1     a     q
1   20    1     b     w
2   10    2     a     e
3   30    3     c     e

Может быть много строк data. Возможно, можете использовать index = ['pid', 'sid'].

Как я могу преобразовать его в Excel в следующем формате?

То есть, индексировать по pid, выбирать блоки строк по 'sid', с итерацией по приращению. Затем добавьте их как блоки столбцов справа.

sid   1             2              3
pid   data1  data2  data1  data2   data1  data2
 10   a      q      a      e       None   None
 20   b      w      None   None    None   None
 30   None   None   None   None    c      e

Спасибо.

1 Ответ

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

Там очень хорошая ссылка в комментарии. Однако, чтобы ответить на ваш конкретный c вопрос, вот способ его достижения:

>>> df = df.pivot(index='pid',columns='sid',values=['data1','data2'])
>>> df
    data1           data2          
sid     1    2    3     1    2    3
pid                                
10      a    a  NaN     q    e  NaN
20      b  NaN  NaN     w  NaN  NaN
30    NaN  NaN    c   NaN  NaN    e

Это дает вам правильный круг, но не обязательно в том порядке, в котором вы этого хотите. Поэтому нам нужно поменять местами уровень по столбцам:

>>> df.columns = df.columns.swaplevel()
>>> df
sid     1     2     3     1     2     3
    data1 data1 data1 data2 data2 data2
pid                                    
10      a     a   NaN     q     e   NaN
20      b   NaN   NaN     w   NaN   NaN
30    NaN   NaN     c   NaN   NaN     e

И затем отсортировать его:

>>> df = df.sort_index(axis=1)
>>> df
sid     1           2           3      
    data1 data2 data1 data2 data1 data2
pid                                    
10      a     q     a     e   NaN   NaN
20      b     w   NaN   NaN   NaN   NaN
30    NaN   NaN   NaN   NaN     c     e

Или вы можете просто объединить методы вместе:

>>> df = df.pivot(index='pid',columns='sid',values=['data1','data2']).swaplevel(axis=1).sort_index(axis=1)
>>> df 
sid     1           2           3      
    data1 data2 data1 data2 data1 data2
pid                                    
10      a     q     a     e   NaN   NaN
20      b     w   NaN   NaN   NaN   NaN
30    NaN   NaN   NaN   NaN     c     e
...