Добавление пустой ячейки в фрейм данных на основе значения столбца (Excel: вставить ячейку и сдвинуть вправо)

#python #pandas

#python #pandas

Вопрос:

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

Я сделал это с помощью openpyxl и цикла, шаги, которые я использовал

 wb = openpyxl.load_workbook('file.xlsx')
ws = wb['sheet']

if 'SheetArranged' not in wb.sheetnames:
  wb.create_sheet('SheetArranged')
  wb.save('file.xlsx')
ws3 = wb.get_sheet_by_name('SheetArranged')


b = 1
for i in range(1, ws.max_row):

'''
if lvl data is absent
'''

if lvl != None:
    lvl == lvl
else:
    lvl = 1

'''
indented data
'''

try:
    for j in range(1,5):
        ws3.cell(row = b, column = lvl j 2).value = ws.cell(row = i, column = 3 j).value
except:
    pass
  

То, что я искал, — это более простой способ добиться этого в pandas

 df>>

A    B    C
P1   1    C1
P2   3    C2
P3   2    C3
  

Ожидаемый результат

 A    B    C    Csub2  Csub3  Csub4
P1   1    Nan  C1
P2   3    Nan  Nan    Nan    C2
P3   2    Nan  Nan    C3
  

Любая помощь будет оценена, спасибо

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

1. Почему значение для B изменяется с 4 на 3 для A=P2 ?

2. Вы ищете какую-то одноразовую кодировку? Оформить заказ get_dummies в pandas? Более четкое представление о том, почему попытка форматирования таким образом может помочь

3. @harvpan извините, это была опечатка. Исправлено. Спасибо

4. @KenSyme это только для форматирования Excel, отступы — очень полезная наглядная помощь при чтении большой спецификации. Эта форма получает цветовую маркировку и печатается на бумаге. Отступы или форматирование такого рода могут показаться ненужными для большинства, но они спасают, когда вы пытаетесь сделать данные доступными для чтения всем.

Ответ №1:

Я думаю, что в pandas вы можете сделать с pivot

 pd.concat([df.assign(C=np.nan),df.pivot(columns='B',values='C')],axis=1)
Out[89]: 
    A  B   C    1    2    3
0  P1  1 NaN   C1  NaN  NaN
1  P2  3 NaN  NaN  NaN   C2
2  P3  2 NaN  NaN   C3  NaN
  

Обновить

 s=pd.DataFrame([[np.nan]*x y for x,y  in zip(df.B,df.loc[:,'C':].values.tolist())],index=df.index)
df=pd.concat([df,s],1)
df
Out[1007]: 
    A  B   C   0    1     2     3
0  P1  1  C1 NaN   C1  None  None
1  P2  3  C2 NaN  NaN   NaN    C2
2  P3  2  C3 NaN  NaN    C3  None
  

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

1. очень умный способ сделать это. 🙂

2. @Wen-Ben это хороший обходной путь для примера, который у меня был. Однако, похоже, это не очень хорошее решение, когда столбец C расширяется и имеет столбец D, и оба они должны двигаться вместе. у вас есть какие-либо идеи для этого

3. @Shri вы можете просто повторить выше pd.concat([df.assign(C=np.nan,'D'),df.pivot(columns='B',values='C'),df.pivot(columns='B',values='D')],axis=1)

4. @Wen-Ben concat не работает для того, о чем я говорил. <br/> df, который я искал, выглядит так 0 P1 1 NaN C1 D1 <br/> 0 P2 3 NaN NaN NaN C2 D2