У меня есть фрейм данных, в котором один столбец представляет собой категориальные строки, а следующий - соответствующие ему значения:

df = pd.DataFrame(list((['a', 'b', 'c', 'buy', 5],
                      ['f', 'b', 'a', 'buy', 2],
                      ['a', 'b', 'c', 'sold', 6],
                      ['a', 'b', 'f', 'buy', 4],
                      ['a', 'b', 'c', 'returned', 'yes'])), columns = ['attr1', 'attr2','attr3','status','value'])

initial df with too many rows that are duplicated

Я хочу создать новые столбцы на основе столбца df.status и заполнить пустые с помощью np.nan, требуется поворот для нескольких столбцов:

result df after pivot on multiple indexes

Я ищу эффективное решение, подходящее для больших фреймов данных.

0
Salman 24 Янв 2021 в 20:41

2 ответа

Лучший ответ

IIUC, Вы хотите:

In [255]: df.pivot(index=['attr1', 'attr2', 'attr3'],columns='status', values='value').rename_axis(None, axis=1).reset_index()
Out[255]: 
  attr1 attr2 attr3 buy returned sold
0     a     b     c   5      yes    6
1     a     b     f   4      NaN  NaN
2     f     b     a   2      NaN  NaN
1
Mayank Porwal 24 Янв 2021 в 18:17

Я не уверен, самый эффективный это метод или нет. Также ваша логика мне не понятна с картинки.

df.index.name = 'index'
df2 = df.pivot(columns='status', values='value')
df.drop(columns=['status', 'value'], inplace=True)
df = df.merge(df2, on='index')

Выход

    attr1   attr2   attr3   buy returned    sold
index                       
0   a   b   c   5   NaN NaN
1   f   b   a   2   NaN NaN
2   a   b   c   NaN NaN 6
3   a   b   f   4   NaN NaN
4   a   b   c   NaN yes NaN
0
Epsi95 24 Янв 2021 в 18:04
65873915