Переформатирование фрейма данных pandas

#python #pandas

#python #pandas

Вопрос:

У меня есть фрейм данных pandas, который выглядит следующим образом.

       ITEM  SKU  PRICE
0  FOO OLD  120     45
1  FOO OLD  121     48
2  BAR OLD  122     51
3  BAR OLD  123     54
4  FOO NEW  120     60
5  FOO NEW  121     65
6  BAR NEW  122     70
7  BAR      123     75
8  BAR      124     80
  

Уточнение: я могу гарантировать отсутствие двусмысленности в отношении значения в ITEM и фактически гарантирую, что оно будет правильно разделено на A и B перед преобразованием.

Я хочу преобразовать его в это:

   ITEM  SKU  OLD  NEW
0  FOO  120   45   60
1  FOO  121   50   65
2  BAR  122   55   70
3  BAR  123   60   75
4  BAR  124  NaN   80
  

Я знаю, что могу разделить старые цены на новые, переименовать столбцы и даже удалить " NEW" и " OLD" из ITEM . Я понятия не имею, что с ним делать после этого.

Кроме того, я подозреваю, что в этих шагах нет необходимости, потому что, вероятно, есть лучший способ изменить этот фрейм данных более чисто.

Ответ №1:

Использование:

 df[['A','B']] = df.pop('ITEM').str.split(expand=True)
df['B'] = df['B'].fillna('NEW')

df = df.set_index(['A','SKU','B'])['PRICE'].unstack().reset_index().rename_axis(None, axis=1)
print (df)
     A  SKU   NEW   OLD
0  BAR  122  70.0  51.0
1  BAR  123  75.0  54.0
2  BAR  124  80.0   NaN
3  FOO  120  60.0  45.0
4  FOO  121  65.0  48.0
  

Если не работает, потому что дублирует:

 df = df.pivot_table(index=['A','SKU'], columns='B', values='PRICE').reset_index()
  

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

1. Как это изменится, если мой оригинал ITEM не может быть разделен всегда и имеет такие значения, как FOO OLD и FOO вместо FOO OLD и FOO NEW ?

2. @Vishal — Возможно ли изменить образец данных для него?

3. Измененный образец данных, представленный в вопросе, согласно моему пониманию вашего комментария.

4. @Vishal — Значит, он должен отсутствовать в той или иной категории, NEW или OLD ? Возможно ли отсутствие в обоих?