如果我的问题不清楚/格式错误,我是Stack的溢出新手。 (使用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
这是我将如何做到这一点。我首先将'Date'和'Contract Month'字段转换为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