Вы можете сделать это следующим образом (обратите внимание, что я считаю St_Date Nan
пустой строкой в ответе ниже):
# Add a field containing previous index if St_date is empty
df["idx"] = df.apply(lambda x: x.name if x.St_date!='' else None, axis=1).ffill()
df
Должен вернуть это:
St_date En_date Des Ch Deb Cr Tot idx
0 01/06/18 01/06/18 CSH nan nan 1000 5786 0.0
1 nan DEPOSIT nan nan nan nan 0.0
2 01/06/18 01/06/18 DEP TFR nan 100 nan 5686 2.0
3 nan through nan nan nan nan 2.0
Затем вы можете сгруппировать с этим новым столбцом и объединить ваше поле Des
:
dfg = pd.DataFrame(df.groupby('idx')["Des"].apply(lambda x: "{%s}" % ', '.join(x)))
# Then you merge the result with the original dataframe on index
df = pd.merge(df.drop('Des',axis=1), dfg , left_index=True, right_index=True, how='left')
# Filter rows with empty values in Des (not merged) and reset index
df = df[df.Des.isna()==False].reset_index(drop=True)
df
Итак, вы идете:
St_date En_date Ch Deb Cr Tot idx Des
0 01/06/18 01/06/18 nan nan 1000 5786 0.0 {CSH, DEPOSIT}
1 01/06/18 01/06/18 nan 100 nan 5686 2.0 {DEP TFR, through}