我目前有一个看起来像这样的pandas DataFrame:
Data
2018-07-02 15.60
2018-07-03 16.14
2018-07-09 12.69
2018-07-17 12.06
2018-07-19 12.87
2018-07-27 13.03
2018-08-01 13.15
2018-08-02 12.19
2018-08-07 10.93
2018-08-09 11.27
2018-08-10 13.16
2018-08-16 13.45
2018-08-17 12.64
2018-08-20 12.49
2018-08-21 12.86
2018-08-22 12.25
我还有日期列表:
dates = [datetime.datetime(2018, 8, 20, 0, 0),
datetime.datetime(2018, 8, 1, 0, 0),
datetime.datetime(2018, 7, 2, 0, 0)]
我想在我的DataFrame中添加另一列,称为“ Count”。它从日期列表中的最新日期开始计数,并在DataFrame中的datetimeindex与列表中的下一个日期匹配时将其重置。最终结果应如下所示:
Data Count
2018-07-02 15.60 1
2018-07-03 16.14 6
2018-07-09 12.69 5
2018-07-17 12.06 4
2018-07-19 12.87 3
2018-07-27 13.03 2
2018-08-01 13.15 1
2018-08-02 12.19 7
2018-08-07 10.93 6
2018-08-09 11.27 5
2018-08-10 13.16 4
2018-08-16 13.45 3
2018-08-17 12.64 2
2018-08-20 12.49 1
在大型DataFrame上最有效的方法是什么?
答案 0 :(得分:2)
使用GroupBy.cumcount
和isin
创建的助手Series
的{{3}},并为交换顺序添加[::-1]
:
s = pd.Series(df.index.isin(dates), index=df.index)[::-1].cumsum()
df['Count'] = df.groupby(s).cumcount(ascending=False) + 1
print (df)
Data Count
2018-07-02 15.60 1
2018-07-03 16.14 6
2018-07-09 12.69 5
2018-07-17 12.06 4
2018-07-19 12.87 3
2018-07-27 13.03 2
2018-08-01 13.15 1
2018-08-02 12.19 7
2018-08-07 10.93 6
2018-08-09 11.27 5
2018-08-10 13.16 4
2018-08-16 13.45 3
2018-08-17 12.64 2
2018-08-20 12.49 1
答案 1 :(得分:0)
编写一个函数,该函数查找DateTimeIndex和日期列表之间的时间事件的最小差异。在数据框的索引上应用apply映射以获得新列。
您可以根据需要以适当的方式使用以下代码。
def time_diff(i):
dates = [datetime.datetime(2018, 8, 20, 0, 0),
datetime.datetime(2018, 8, 1, 0, 0),
datetime.datetime(2018, 7, 2, 0, 0)]
diff_values = [ j - i for j in dates if j - i[0] != '-']
if len(diff_values) > 0:
return min(diff_values)
dataframe["Count"] = dataframe.index.map(time_diff)