如何计算前 x 行中特定字符串的出现次数
how to count occurrences of specific string in previous x rows
我有一个活动列表和它们发生的大致时间戳。我想计算一个字符串在前 'x' 行(步行或 运行 等)中的出现次数,并且将其添加到数据框。 Pandas DataFrame 不支持滚动(对于非数字数据),我不确定我是否可以像以前的 30、50 甚至 70 行数据一样使用 shift 来检查。我还没有取得任何具体进展,因为我一直在网站上寻找类似的 questions/solutions。
timestamp event
0 2021-12-18 18:20:25+08:00 running
1 2021-12-18 18:20:27+08:00 running
2 2021-12-18 18:20:29+08:00 walking
3 2021-12-18 18:20:31+08:00 walking
4 2021-12-18 18:20:33+08:00 walking
5 2021-12-18 18:20:35+08:00 walking
6 2021-12-18 18:20:37+08:00 walking
7 2021-12-18 18:20:39+08:00 walking
8 2021-12-18 18:20:41+08:00 stationary
9 2021-12-18 18:20:43+08:00 stationary
10 2021-12-18 18:20:45+08:00 stationary
11 2021-12-18 18:20:47+08:00 stationary
df.loc[:, 'Count previous K'] = 0 # new column to count previous row activities
预期输出:
timestamp event Count previous K
0 2021-12-18 18:20:25+08:00 running 0
1 2021-12-18 18:20:27+08:00 running 0
2 2021-12-18 18:20:29+08:00 walking 1
3 2021-12-18 18:20:31+08:00 walking 2
4 2021-12-18 18:20:33+08:00 walking 3
5 2021-12-18 18:20:35+08:00 walking 4
6 2021-12-18 18:20:37+08:00 walking 5
7 2021-12-18 18:20:39+08:00 walking 6
8 2021-12-18 18:20:41+08:00 stationary 6
9 2021-12-18 18:20:43+08:00 stationary 6
10 2021-12-18 18:20:45+08:00 stationary 6
11 2021-12-18 18:20:47+08:00 stationary 6
12 2021-12-18 18:20:49+08:00 stationary 5
对于大小为 10(包括当前 index/row)的 window,计算步行的次数。
您可以使用布尔值查看特定事件何时发生,然后对布尔系列执行滚动求和。正如@mozway 指出的那样,参数 min_periods=1
将避免 NaN
出现在结果 DataFrame 的开头:
df['walking_count'] = (df['event'] == 'walking').rolling(5, min_periods=1).sum()
这会为以下系列设置一个新列 'walking_count'
:
0 0.0
1 0.0
2 1.0
3 2.0
4 3.0
5 4.0
6 5.0
7 5.0
8 4.0
9 3.0
10 2.0
11 1.0
我有一个活动列表和它们发生的大致时间戳。我想计算一个字符串在前 'x' 行(步行或 运行 等)中的出现次数,并且将其添加到数据框。 Pandas DataFrame 不支持滚动(对于非数字数据),我不确定我是否可以像以前的 30、50 甚至 70 行数据一样使用 shift 来检查。我还没有取得任何具体进展,因为我一直在网站上寻找类似的 questions/solutions。
timestamp event
0 2021-12-18 18:20:25+08:00 running
1 2021-12-18 18:20:27+08:00 running
2 2021-12-18 18:20:29+08:00 walking
3 2021-12-18 18:20:31+08:00 walking
4 2021-12-18 18:20:33+08:00 walking
5 2021-12-18 18:20:35+08:00 walking
6 2021-12-18 18:20:37+08:00 walking
7 2021-12-18 18:20:39+08:00 walking
8 2021-12-18 18:20:41+08:00 stationary
9 2021-12-18 18:20:43+08:00 stationary
10 2021-12-18 18:20:45+08:00 stationary
11 2021-12-18 18:20:47+08:00 stationary
df.loc[:, 'Count previous K'] = 0 # new column to count previous row activities
预期输出:
timestamp event Count previous K
0 2021-12-18 18:20:25+08:00 running 0
1 2021-12-18 18:20:27+08:00 running 0
2 2021-12-18 18:20:29+08:00 walking 1
3 2021-12-18 18:20:31+08:00 walking 2
4 2021-12-18 18:20:33+08:00 walking 3
5 2021-12-18 18:20:35+08:00 walking 4
6 2021-12-18 18:20:37+08:00 walking 5
7 2021-12-18 18:20:39+08:00 walking 6
8 2021-12-18 18:20:41+08:00 stationary 6
9 2021-12-18 18:20:43+08:00 stationary 6
10 2021-12-18 18:20:45+08:00 stationary 6
11 2021-12-18 18:20:47+08:00 stationary 6
12 2021-12-18 18:20:49+08:00 stationary 5
对于大小为 10(包括当前 index/row)的 window,计算步行的次数。
您可以使用布尔值查看特定事件何时发生,然后对布尔系列执行滚动求和。正如@mozway 指出的那样,参数 min_periods=1
将避免 NaN
出现在结果 DataFrame 的开头:
df['walking_count'] = (df['event'] == 'walking').rolling(5, min_periods=1).sum()
这会为以下系列设置一个新列 'walking_count'
:
0 0.0
1 0.0
2 1.0
3 2.0
4 3.0
5 4.0
6 5.0
7 5.0
8 4.0
9 3.0
10 2.0
11 1.0