Выбор разделов данных из таблицы данных Python с помощью np.nans

1

У меня есть код, который производит вывод 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 очень длинный, поэтому он просто взял фрагмент для иллюстрации.

Спасибо

  • 0
    Почему exitdate в последней строке примера выводится 2018-08-31 а не 2018-09-05 ?
  • 0
    Я думаю, что ответ на этот вопрос вам очень поможет: stackoverflow.com/questions/41420822/…
Показать ещё 2 комментария
Теги:
pandas

2 ответа

1
Лучший ответ

Сначала вам нужно обозначить разделение между группами:

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()
  • 0
    спасибо, я следую решению, пока мы не доберемся до группировки. Я понимаю, что вы группируете, но entrydate и exitdate дают только вход и выход первой группы, а не всех, поэтому я не могу достичь желаемого результата. Есть ли способ перебирать группы для извлечения соответствующей информации? Решение этой проблемы очень элегантно, спасибо
  • 0
    Разобрался, спасибо за помощь.
0

Аналогичное другое решение, как показано ниже:

# 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню