Python和Pandas-在排序后根据日期而不是使用循环对列进行编号

Python和Pandas-在排序后根据日期而不是使用循环对列进行编号,python,pandas,loops,Python,Pandas,Loops,我不熟悉堆栈溢出,因此如果我的问题不清楚/格式错误,我深表歉意。(使用excel屏幕截图进行说明,但问题是python/pandas) 目前,我在python中有一个如下所示的数据帧。我试图找出每个特定“日期”的第一个/第二个合同月等,并相应地编号。随着日期的更改,号码必须重新启动。这个数据帧非常大,至少有一百万行数据 目前,我正在使用python中的循环来实现这一点。基本上是下面的代码片段。计数从0开始,函数用于隔离每个“日期”如何对“合同月”进行排序,然后对其进行编号。之后,我将其附加到数

我不熟悉堆栈溢出,因此如果我的问题不清楚/格式错误,我深表歉意。(使用excel屏幕截图进行说明,但问题是python/pandas)

目前,我在python中有一个如下所示的数据帧。我试图找出每个特定“日期”的第一个/第二个合同月等,并相应地编号。随着日期的更改,号码必须重新启动。这个数据帧非常大,至少有一百万行数据

目前,我正在使用python中的循环来实现这一点。基本上是下面的代码片段。计数从0开始,函数用于隔离每个“日期”如何对“合同月”进行排序,然后对其进行编号。之后,我将其附加到数据帧中,并在循环中继续

不幸的是,这比我想象的要慢。我怀疑这是因为我写循环机制的方式…只是想知道是否有更好的方法来做到这一点?谢谢

    while count < period:

        def previous_day(refday):                             
            refdayindex=DS2_df_date.index(refday)
            return DS2_df_date[refdayindex-count]

        selectedday = (previous_day(Enddate))

        DS2_Sortcontracts=DS2_df.loc[DS2_df['Date'] == selectedday]
        DS2_Sortcontracts = DS2_Sortcontracts.sort_values(by='Contract')
        DS2_Sortcontracts = DS2_Sortcontracts.reset_index(drop=True)
        DS2_Sortcontracts.index = DS2_Sortcontracts.index + 1
        DS2_Sortcontracts['Chain']=DS2_Sortcontracts.index
        DS2_df2=DS2_df2.append(DS2_Sortcontracts)
        count=count+1            
计数<期间:
def前一天(参考日):
refdayindex=DS2\u df\u日期索引(refday)
返回DS2_df_日期[refdayindex count]
选择日期=(上一天(结束日期))
DS2_Sortcontracts=DS2_df.loc[DS2_df['Date']==selectedday]
DS2\u Sortcontracts=DS2\u Sortcontracts.sort\u值(按class='Contract')
DS2\u Sortcontracts=DS2\u Sortcontracts.reset\u索引(drop=True)
DS2_Sortcontracts.index=DS2_Sortcontracts.index+1
DS2_Sortcontracts['Chain']=DS2_Sortcontracts.index
DS2_df2=DS2_df2.append(DS2_Sortcontracts)
计数=计数+1

以下是我的做法。我会首先将“日期”和“合同月”字段转换为datetime,以便对它们进行正确排序,然后将使用
cumcount
assign
groupby
一起使用

#Convert to date time for sorting
df['Date'] = pd.to_datetime(df['Date'],format='%d/%m/%Y')
df['Contract Month'] = pd.to_datetime(df['Contract Month'],format='%d%b%Y')

#Sort by date and contract month
df.sort_values(by=['Date','Contract Month'])

#Count contract months within each 'Date group
df = df.assign(numbering=df.groupby('Date')['Contract Month'].cumcount()+1)
在:

输出:


欢迎来到堆栈溢出!您可以先学习并创建一个示例。这使我们更容易帮助你。
              Date Contract Month
    0   13/10/2017      01Jan2020
    1   13/10/2017      01Feb2020
    2   13/10/2017      01Mar2020
    3   13/10/2017      01Apr2020
    4   13/10/2017      01May2020
    5   13/10/2017      01Jun2020
    6   12/10/2017      01Jan2020
    7   12/10/2017      01Feb2020
    8   12/10/2017      01Mar2020
    9   12/10/2017      01Apr2020
    10  12/10/2017      01May2020
    11  12/10/2017      01Jun2020
    12  11/10/2017      01Jan2020
    13  11/10/2017      01Feb2020
    14  11/10/2017      01Mar2020
    15  11/10/2017      01Apr2020
    16  11/10/2017      01May2020
    17  11/10/2017      01Jun2020
    18  11/10/2017      01Jul2020
         Date Contract Month  numbering
12 2017-10-11     2020-01-01          1
13 2017-10-11     2020-02-01          2
14 2017-10-11     2020-03-01          3
15 2017-10-11     2020-04-01          4
16 2017-10-11     2020-05-01          5
17 2017-10-11     2020-06-01          6
18 2017-10-11     2020-07-01          7
6  2017-10-12     2020-01-01          1
7  2017-10-12     2020-02-01          2
8  2017-10-12     2020-03-01          3
9  2017-10-12     2020-04-01          4
10 2017-10-12     2020-05-01          5
11 2017-10-12     2020-06-01          6
0  2017-10-13     2020-01-01          1
1  2017-10-13     2020-02-01          2
2  2017-10-13     2020-03-01          3
3  2017-10-13     2020-04-01          4
4  2017-10-13     2020-05-01          5
5  2017-10-13     2020-06-01          6