【问题标题】:How to sort output within a group by date?如何按日期对组内的输出进行排序?
【发布时间】:2022-01-12 18:33:05
【问题描述】:

我有一个数据框,它是筛选所有 S&P500 股票的结果,并且正在对筛选期间发现的一些 SOS 信号以及每个信号出现的日期进行分类。

对于这个数据框,我应用了以下过滤器,因为我只想关注具有这些信号的股票:测试每个股票的上涨、吸收量、停止量

s = {'Stopping Vol', 'Absorption Vol', 'Test in Rising'}
df.groupby('Ticker').filter(lambda sf: s.issubset(sf['SOS']))

这是输出:

     Ticker             SOS        Date  frequency
756    BXSL  Test in Rising  2021-12-21         11
757    BXSL    Stopping Vol  2021-12-27         11
758    BXSL    Stopping Vol  2021-12-28         11
759    BXSL  Selling Climax  2021-12-28         11
760    BXSL        Shakeout  2021-12-28         11
761    BXSL  Absorption Vol  2021-12-30         11
762    BXSL     Bag Holding  2021-12-30         11
763    BXSL  Test in Rising  2021-12-30         11
764    BXSL    Stopping Vol  2022-01-03         11
765    BXSL  Absorption Vol  2022-01-06         11
766    BXSL  Test in Rising  2022-01-06         11
5057   WDAY  Test in Rising  2021-12-16          9
5058   WDAY            Test  2021-12-20          9
5059   WDAY  Test in Rising  2021-12-20          9
5060   WDAY  Test in Rising  2021-12-22          9
5061   WDAY  Test in Rising  2021-12-29          9
5062   WDAY    Stopping Vol  2022-01-04          9
5063   WDAY  Selling Climax  2022-01-04          9
5064   WDAY        Shakeout  2022-01-04          9
5065   WDAY  Absorption Vol  2022-01-05          9
1167   CROX    Stopping Vol  2021-12-17          9

我现在遇到的问题是,我只想要那些满足这些信号的代码,但我还想按出现日期保持信号的顺序。我只想在我首先看到 Stopping Vol 信号,然后是 Absorption Vol 信号,最后是 Test in Rising 信号时才显示 Ticker。中间有没有其他信号都没关系,我只想保持它们之间的顺序。

所以输出类似于:

     Ticker             SOS        Date  frequency
756    JPGY  Selling Climax  2021-12-21         11
757    JPGY    Stopping Vol  2021-12-27         11
758    JPGY    Other signal  2021-12-28         11
761    JPGY  Absorption Vol  2021-12-30         11
763    JPGY  Test in Rising  2021-12-31         11

我怎样才能得到这个?

我正在查看其他问题,但不知道如何进行。 pandas groupby sort within groups

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    用途:

    #in set is not defined order, so use list ot tuple
    L = ['Stopping Vol', 'Absorption Vol', 'Test in Rising']
    
    #filter rows if match all 3 values
    df1 = df.groupby('Ticker').filter(lambda sf: set(L).issubset(sf['SOS']))
    
    #get only rows with L
    df1 = df1[df1['SOS'].isin(L)]
    
    #get first and last values per filtered df1
    df1 = df1.groupby(['Ticker'])['SOS'].agg(['first','last'])
    
    #and test if first column is first value in L and last column last value in L
    #middle values is already tested, so got only groups in this order
    tickers = df1.index[df1['first'].eq(L[0]) & df1['last'].eq(L[2])]
    df2 = df[df['Ticker'].isin(tickers)]
    print (df2)
    

    【讨论】:

    • 现在完美运行!非常感谢您的解释,这非常有帮助。
    猜你喜欢
    • 2014-10-15
    • 2016-11-07
    • 1970-01-01
    • 2011-12-06
    • 2011-03-19
    • 2013-10-26
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    相关资源
    最近更新 更多