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

#python #pandas

Вопрос:

У меня есть фрейм данных следующим образом:

 data = {
    'Title': ['001C', '001C', '004C', '001C', '004C', '004C', '007C', '010C'],
    'Items': ['A', 'B', 'D', 'A', 'A', 'K', 'L', 'M']
}
df = pd.DataFrame(data)
 

df

     Title   Items
0   001C    A
1   001C    B
2   004C    D
3   001C    A
4   004C    A
5   004C    K
6   007C    L
7   010C    M
 

Я хочу получить Items под каждым Title без какой-либо избыточности. Ожидаемый результат составляет

     001C    004C    007C    010C
0   A       D       L       M
1   B       A                
2           K                       
 

Ответ №1:

Вы можете drop_duplicates , assign вспомогательный столбец с увеличивающимися индексами на элемент в группе, и pivot :

 (df.drop_duplicates(subset=['Title', 'Items'])
   .assign(index=df.groupby('Title').cumcount())
   .pivot(index='index', columns='Title', values='Items')
   .rename_axis(index=None, columns=None)
  #.fillna('') # uncomment if you want empty strings in place of NaNs 
)
 

выход:

       001C 004C 007C 010C                 
0        A    D    L    M
1        B    A  NaN  NaN
2      NaN    K  NaN  NaN
 

Комментарии:

1. ДА. И если нансы побеспокоят операцию, они могут использовать fillna .

2. df.columns.name, df.index.name = None, None если вы хотите точно соответствовать желаемому выходу OP.

3. @ddejohn да, вы правы, я обновил сообщение (используя rename_axis )

Ответ №2:

Вы также можете использовать .drop_duplicates() .pivot() . Затем переместите значения, отличные от NaN , каждого столбца в начало .dropna() , следующим образом:

 (df.drop_duplicates()
   .pivot(columns='Title', values='Items')
   .apply(lambda x: pd.Series(x.dropna().values))
   .rename_axis(columns=None)
)
 

Результат:

   001C 004C 007C 010C
0    A    D    L    M
1    B    A  NaN  NaN
2  NaN    K  NaN  NaN