Python和Pandas - 在排序后基于除使用循环之外的日期对列进行编号

问题描述 投票:0回答:1

如果我的问题不清楚/格式错误,我是Stack的溢出新手。 (使用excel截图进行说明,但问题是python / pandas)

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

Screenshot here

目前我在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            
python pandas loops
1个回答
1
投票

这是我将如何做到这一点。我首先将'Date'和'Contract Month'字段转换为datetime,以便它们可以正确排序,然后使用cumcountassigngroupby

#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
© www.soinside.com 2019 - 2024. All rights reserved.