2017-03-02 29 views
1

下面是一些例子数据,我工作的问题:熊猫查找序列或模式在列

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 1 

Sales_Growth柱告诉我,如果有在本季度或不确实的销售增长。 0 =没有增长,1 =增长。

首先,我试图在连续两个季度没有销售增长时返回第一个Quarter

以上回答的数据为2001q1

然后,我想返回第一季度连续第二季度的销售增长,这是在前两个季度没有增长之后发生的。

这个问题的答案是2004q4

我找啊找,但最接近的答案,我可以找到我不能去上班:https://stackoverflow.com/a/26539166/3225420

预先感谢帮助一个熊猫新手,我劈砍而去,尽我所能,但被卡住在这一个。

回答

2

你做的序列匹配。这是一个有点怪,但包涵:

growth = df.Sales_Growth.astype(str).str.cat() 

这就给了你:

'00100011' 

然后:

growth.index('0011') 

给你4(很明显,你会添加一个常数3得到模式匹配的最后一行的索引)。

我觉得这种方法开始有点丑陋,但最终的结果是真的可用 - 你可以搜索任何固定的模式,没有额外的编码。

+0

选择这个答案的主要原因有两个:首先,它的工作,其次我的理解。其他答案也可能起作用,但超出了我的理解范围。错误不在那些提供给他们的我不明白的人身上,而在于我。我需要学习更多。简单分享我的推理。 – SDS

+0

@SDS:干杯。我也发现这种处理它的方式更容易思考。另外它更少打字。 :) –

2

对于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) 
2

建立在较早的答案上。 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通话,windowmin_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()) 
+0

你在这里很有效地创建一个Python循环,这很慢。通常在熊猫我们避免这种情况。 –