#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