Нечто подобное может работать.Для каждой группы, где количество больше 4, примените функцию, которая разбивает строки и сохраняет их во временном фрейме данных, а затем объединяет все вместе, чтобы получить желаемый результат:
df = pd.DataFrame({'idx': ['A', 'B', 'C', 'D'],
'quantity': [3, 4, 10, 11]})
def split_quant(df):
quantities = ([4]*(df['quantity'].iat[0] // 4)) + [df['quantity'].iat[0] % 4]
temp = pd.DataFrame({'idx': df['idx'].iat[0],
'quantity': quantities
}, index=range(len(quantities)))
temp = temp[temp['quantity']!=0]
return temp
df_split = df[df['quantity'] > 4].groupby('idx').apply(split_quant)
output = df[df['quantity'] <= 4].append(df_split).reset_index(drop=True)
writer = pd.ExcelWriter('output.xlsx')
output.to_excel(writer, 'Sheet1', index=False)
writer.save()
Вышеприведенное даст вамследующий выходной фрейм данных:
idx quantity
0 A 3
1 B 4
2 C 4
3 C 4
4 C 2
5 D 4
6 D 4
7 D 3
РЕДАКТИРОВАТЬ:
Я позволил себе провести некоторые временные тесты различных методов.Использование Pandas 'groupby
и apply
экономит много времени и позволяет избежать вложенных циклов над входными данными (хотя я уверен, что есть еще более быстрый способ, который также может избежать apply
...)
Шахта:
5.49 ms ± 240 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
@ Икбал Басьяр:
22.8 ms ± 1.47 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
@ sobek
17.7 ms ± 922 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)