У меня есть код, который производит вывод dataframe, столбцов date и x (заданное значение). df=
index date colx
2018-08-09 NaN NaN
2018-08-10 2018-08-10 00:00:00 -0.200460
2018-08-13 NaN NaN
2018-08-14 NaN NaN
2018-08-15 NaN NaN
2018-08-16 NaN NaN
2018-08-17 NaN NaN
2018-08-20 NaN NaN
2018-08-21 NaN NaN
2018-08-22 2018-08-22 00:00:00 -2.317475
2018-08-23 2018-08-23 00:00:00 -1.652724
2018-08-24 2018-08-24 00:00:00 -3.669870
2018-08-27 2018-08-27 00:00:00 -3.807074
2018-08-28 2018-08-28 00:00:00 -0.257006
2018-08-29 NaN NaN
2018-08-30 2018-08-30 00:00:00 -0.374825
2018-08-31 2018-08-31 00:00:00 -5.655345
2018-09-03 2018-09-03 00:00:00 -4.631105
2018-09-04 2018-09-04 00:00:00 -4.722768
2018-09-05 2018-09-05 00:00:00 -3.012673
2018-09-06 NaN NaN
Столбец Date совпадает с индексом, для выбранных значений и np.nan для других разделов.
То, что я хочу достичь и не знаю, как это сделать, заключается в том, чтобы извлечь первую дату и последнюю дату блока данных (без 00:00:00)
С помощью следующей ссылки я могу решить проблему cumsum
но не извлечение данных в требуемый результат ниже:
python pandas условная суммарная сумма
b = df.colx
c = b.cumsum()
df['cumsumcolx']=c.sub(c.mask(b != 0).ffill(), fill_value=0).astype(float)
Этот код дает мне:
index date colx cumsumcolx
2018-08-09 0 0 0
2018-08-10 2018-08-10 00:00:00 -0.200460 -0.200460
2018-08-13 0 0 0
2018-08-14 0 0 0
2018-08-15 0 0 0
2018-08-16 0 0 0
2018-08-17 0 0 0
2018-08-20 0 0 0
2018-08-21 0 0 0
2018-08-22 2018-08-22 00:00:00 -2.317475 -2.317475
2018-08-23 2018-08-23 00:00:00 -1.652724 -3.970198
2018-08-24 2018-08-24 00:00:00 -3.669870 -7.640069
2018-08-27 2018-08-27 00:00:00 -3.807074 -11.447143
2018-08-28 2018-08-28 00:00:00 -0.257006 -11.704148
2018-08-29 0 0 0
2018-08-30 2018-08-30 00:00:00 -0.374825 -0.374825
2018-08-31 2018-08-31 00:00:00 -5.655345 -6.030169
2018-09-03 2018-09-03 00:00:00 -4.631105 -10.661275
2018-09-04 2018-09-04 00:00:00 -4.722768 -15.384043
2018-09-05 2018-09-05 00:00:00 -3.012673 -18.396715
2018-09-06 0 0 0
Таким образом, im просит помочь с извлечением, так что я получаю ожидаемый вывод таблицы /dataframe:
entrydate exitdate cumsumcolx
2018-08-10 2018-08-10 -0.200460
2018-08-22 2018-08-28 -11.704148
2018-08-30 2018-09-05 -18.396715
мой df очень длинный, поэтому он просто взял фрагмент для иллюстрации.
Спасибо
Сначала вам нужно обозначить разделение между группами:
blanks = df.date.isnull()
Затем назовите сами группы:
df['group'] = blanks.cumsum()
Теперь у вас есть столбец, который помещает каждую группу с одним небольшим дефектом в том, что первым членом каждой группы является строка NAN. Просто удалите такие строки:
df = df[~blanks]
Затем используйте groupby:
grouped = df.groupby('group')
entrydate = grouped.date.first()
exitdate = grouped.date.last()
cumsumcolx = grouped.colx.sum()
Аналогичное другое решение, как показано ниже:
# Python Code
def AggSum(dfg):
return pd.DataFrame([[dfg.iloc[0].idx, dfg.iloc[-1].date, dfg.colx.sum()]],
columns=['entrydate', 'exitdate', 'cumsumcolx'])
df['idx'] = pd.to_datetime(df['idx'])
df['date'] = pd.to_datetime(df['date'])
df['Group'] = df.colx.isnull().cumsum()
df2 = df[df.colx.notnull()].groupby('Group', as_index=False).apply(AggSum)
df2.reset_index(drop=True, inplace=True)
#Output dataframe
entrydate exitdate cumsumcolx
0 2018-08-10 2018-08-10 -0.200460
1 2018-08-22 2018-08-28 -11.704149
2 2018-08-30 2018-09-05 -18.396716
exitdate
в последней строке примера выводится2018-08-31
а не2018-09-05
?