Pandas 在列中查找序列或模式
Pandas find sequence or pattern in column
这是我正在处理的问题的一些示例数据:
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 = 增长。
首先,当连续两个季度没有销售增长时,我正在尝试 return 第一个 Quarter
。
根据上面的数据,这个答案将是 2001q1
。
然后,我想 return 在前两个季度没有增长之后出现的第二个连续销售增长。
这个问题的答案是 2004q4
。
我已经搜索过了,但我无法找到最接近的答案:
我是 Pandas 初学者。
第 1 季度:
temp = df.Sales_Growth + df.Sales_Growth.shift(-1)
df[temp == 0].head(1)
第 2 季度:
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)
您正在进行子序列匹配。这有点奇怪,但请耐心等待:
growth = df.Sales_Growth.astype(str).str.cat()
这给你:
'00100011'
然后:
growth.index('0011')
给你 4(显然你会添加一个常量 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 调用中,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())
这是我正在处理的问题的一些示例数据:
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 = 增长。
首先,当连续两个季度没有销售增长时,我正在尝试 return 第一个 Quarter
。
根据上面的数据,这个答案将是 2001q1
。
然后,我想 return 在前两个季度没有增长之后出现的第二个连续销售增长。
这个问题的答案是 2004q4
。
我已经搜索过了,但我无法找到最接近的答案:
我是 Pandas 初学者。
第 1 季度:
temp = df.Sales_Growth + df.Sales_Growth.shift(-1)
df[temp == 0].head(1)
第 2 季度:
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)
您正在进行子序列匹配。这有点奇怪,但请耐心等待:
growth = df.Sales_Growth.astype(str).str.cat()
这给你:
'00100011'
然后:
growth.index('0011')
给你 4(显然你会添加一个常量 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 调用中,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())