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