【问题标题】:Selecting sections of data from a python dataframe with np.nans使用 np.nans 从 python 数据框中选择数据部分
【发布时间】:2018-09-22 22:03:17
【问题描述】:

我有一些代码可以生成数据框输出,列日期和 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 的问题,但不能将数据提取 到下面所需的输出中:

python pandas conditional cumulative sum

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  

因此,我在提取方面寻求帮助,以便实现表/数据框的预期输出:

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 很长,因此只是为了说明目的而对其进行了 sn-p。

谢谢

【问题讨论】:

  • 为什么exitdate在示例输出的最后一行2018-08-31而不是2018-09-05?
  • 我觉得这个问题的答案对你有很大帮助:stackoverflow.com/questions/41420822/…
  • @ChrisA 你指出我的错误是对的,应该是'2018-09-05'。感谢您发现这一点,我将编辑帖子
  • @onno 谢谢我会调查,我认为这对提取所需的 entrydate 和 exitdate 列没有帮助,但是,我会继续努力解决这个问题

标签: python pandas


【解决方案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()

【讨论】:

  • 谢谢,我按照解决方案进行操作,直到进入分组。我了解您是分组的,但是 entrydate 和 exitdate 只给出了第一组的进入和退出,而不是全部,因此我无法达到预期的输出。有没有办法遍历组以提取相关信息?这点的解决方法很优雅,谢谢
【解决方案2】:

类似的另一种解决方案如下:

# 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2018-03-22
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多