2017-03-02 31 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循環,這很慢。通常在熊貓我們避免這種情況。 –