将移位计数有效地应用于DataFrame

时间:2017-04-06 01:42:50

标签: python-3.x pandas numpy dataframe apply

我正在对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

2 个答案:

答案 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())