使用np.nans从python数据帧中选择数据段
我有一些代码,可以生成数据帧输出,包括列date和x(给定值)<代码>df=使用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
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