下面是我正在处理的问题的一些示例数据:
index Quarter Sales_Growth
0 2001q1 0
1 2002q2 0
2 2002q3 1
3 2002q4 0
4 2003q1 0
5 2004q2 0
6 2004q3 1
7 2004q4 1Sales_Growth专栏告诉我,该季度的销售额是否确实出现了增长。0=无增长,1=增长。
首先,当销售额连续两个季度没有增长时,我正试图返回第一个Quarter。
根据上面的数据,这个答案将是2001q1。
然后,我想返回连续第二季度的销售增长,在最初的两个季度没有增长。
这个问题的答案是2004q4。
我已经搜索过,但最接近的答案是我找不到工作:https://stackoverflow.com/a/26539166/3225420
我是潘达斯的初学者。
发布于 2017-03-02 12:32:53
你在做子序列匹配。这有点奇怪,但请原谅我:
growth = df.Sales_Growth.astype(str).str.cat()这给了你:
'00100011'然后:
growth.index('0011')给出4(很明显,您会添加一个常量3来获得与模式匹配的最后一行的索引)。
我觉得这种方法一开始有点难看,但是最终结果是有用的--你可以在没有额外编码的情况下搜索任何固定的模式。
发布于 2017-03-02 12:18:03
对于Q1:
temp = df.Sales_Growth + df.Sales_Growth.shift(-1)
df[temp == 0].head(1)对于Q2:
df[(df.Sales_Growth == 1) & (df.Sales_Growth.shift(1) == 1) & (df.Sales_Growth.shift(2) == 0) & (df.Sales_Growth.shift(3) == 0)].head(1)发布于 2017-03-02 20:54:25
以先前的答案为基础。Q1:
temp = df.Sales_Growth.rolling_apply(window=2, min_periods=2, \
kwargs={pattern: [0,0]}, func=lambda x, pattern: x == pattern)
print(df[temp==1].head())在rolling_apply调用中,window和min_periods必须匹配传递给rolling_apply函数的模式列表的长度。
Q2:相同的方法,不同的模式:
temp = df.Sales_Growth.rolling_apply(window=4, min_periods=4, \
kwargs={pattern: [0,0,1,1]}, func=lambda x, pattern: x == pattern)
print(df[temp==1].head())https://stackoverflow.com/questions/42555031
复制相似问题