我正在对DataFrame
的每一列执行操作,该列按周编制索引。也就是说,在每一列中,我计算一个条目不等于前一个条目(不包括第一个条目)的第一个出现,并输出最后一个时间段和发生这个条目的时间段之间的差异。
问题是这非常慢,我不确定如何简化它,可能使用numpy
。这是我的代码:
def sh(ser):
if ser.drop_duplicates().shape[0]==1:
return np.nan
s = ( ser!=ser.shift() )[1:]
a=s[s].index[0]
b=s.index[-1]
c = - (a-b)
return c.days/7 + 1
cols = prices.columns
timeDiffs = []
for col in cols:
ser = prices[col]
timeDiffs.append(sh(ser))
output = pd.Series(timeDiffs)
要了解这是做什么的,如果`df如下:
0 1 2
index
2015-11-15 9 15.0 8
2015-11-22 9 15.0 8
2015-11-28 3.2 15.0 8
2015-12-06 3.2 15.0 8
2015-12-13 4 15.0 8
2015-12-20 5 15.0 2
output
是:
4
nan
1
答案 0 :(得分:2)
将索引设置为日期时间
df.index = pd.to_datetime(df.index)
df_1 = df.diff(-1).fillna(method='ffill').astype(bool).cumsum().replace(0,np.nan)
(df_1.idxmax() - df_1.idxmin()).astype('timedelta64[D]') / 7
0 4.0
1 NaN
2 1.0
dtype: float64
答案 1 :(得分:1)
from pandas import DataFrame
index = [u'2015-11-15', u'2015-11-22', u'2015-11-28', u'2015-12-06', u'2015-12-13', u'2015-12-20']
df = DataFrame({0: [9, 9, 3.2, 3.2, 4, 5], 1: [15, 15, 15, 15, 15, 15], 2: [8, 8, 8, 8, 8, 2]}, index)
df.apply(lambda x: (x.diff().fillna(0) != 0).astype(int).sum())