Pandas在列中查找序列或模式

时间:2017-03-02 12:04:11

标签: python pandas dataframe sequences

以下是我正在处理的问题的一些示例数据:

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

感谢您提前帮助一位熊猫新手,我尽我所能,但仍然坚持这一点。

3 个答案:

答案 0 :(得分:3)

对于Q1:

temp = df.Sales_Growth + df.Sales_Growth.shift(-1)
df[temp == 0].head(1)

第二季度:

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)

答案 1 :(得分:3)

您正在进行子序列匹配。这有点奇怪,但请耐心等待:

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

这会给你:

'00100011'

然后:

growth.index('0011')

给你4个(显然你要添加一个常量3来获得模式匹配的最后一行的索引)。

我觉得这种方法开始有点难看,但最终结果确实可用 - 您可以搜索任何固定模式而无需额外编码。

答案 2 :(得分:3)

以早期答案为基础。 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())