使用np.nans从python数据帧中选择数据段

使用np.nans从python数据帧中选择数据段,python,pandas,Python,Pandas,我有一些代码,可以生成数据帧输出,包括列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 N

我有一些代码,可以生成数据帧输出,包括列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 
对于选定值,日期列与索引相同;对于其他部分,日期列与np.nan相同

我希望实现的目标是提取数据块的第一个日期和最后一个日期(没有00:00:00),但不确定如何提取

借助以下链接,我能够解决
cumsum
的问题,但不能将数据提取到下面所需的输出中:

这段代码给了我:

   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  
因此,我请求有关提取的帮助,以便实现表/数据帧的预期输出:

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
?我想这个问题的答案会对你有很大帮助:@ChrisA你指出我的错误是对的,应该是“2018-09-05”。谢谢你发现这一点,我将编辑post@onno谢谢,我会调查的,我不认为这会有助于提取所需的entrydate和exitdate列,但是,我会继续努力解决这个问题谢谢,我会按照解决方案进行,直到我们到达分组。我了解您的分组,但entrydate和exitdate只给出第一个组的入口和出口,而不是全部,因此我无法实现所需的输出。是否有一种方法可以迭代组以提取相关信息?这一点的解决方案非常优雅,谢谢
# 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