我有一个 Python 中的 Pandas 数据框,当拉米雷斯进入和离开建筑物时会在其中注册。我还有一个清单,其中记录了大楼内的所有事件,从开灯到冲厕所或呼叫电梯。我已按时间顺序将它们排序为:
Visit 1: C2, C4, C1 None, None
Visit 2: C2, C1, C2, None, None
Visit 3: C1, C3, C1, C2, C3
Visit 4: C1, C2, C3, None, None
依此类推(这意味着在拉米雷斯第一次访问期间,首先发生了 C2,C4,然后是 C1)。
我想知道拉米雷斯负责的事件有哪些。为此,我想找到数据中最常见的序列。 例如,C1、C2 出现在他的第二次、第三次和第四次访问期间。 C2、C3 发生在他的第三次和第四次访问期间。
我需要一个程序来获取从最常见到最不常见的事件链,并且 C1、C1 或任何其他类似的对应该被忽略。
我想要一些关于如何获取此代码的建议
假设这个输入:
0 1 2 3 4
Visit 1 C2 C4 C1 None None
Visit 2 C2 C1 C2 None None
Visit 3 C1 C3 C1 C2 C3
Visit 4 C1 C2 C3 None None
itertools.pairwise
和 collections.Counter
:
from itertools import pairwise
from collections import Counter
out = Counter(p for _, s in df.T.items() for p in pairwise(s.dropna()))
s = pd.Series(out, name='counts')
输出:
# out
Counter({('C1', 'C2'): 3,
('C2', 'C3'): 2,
('C2', 'C4'): 1,
('C4', 'C1'): 1,
('C2', 'C1'): 1,
('C1', 'C3'): 1,
('C3', 'C1'): 1})
# s
C2 C4 1
C4 C1 1
C2 C1 1
C1 C2 3
C3 1
C3 C1 1
C2 C3 2
Name: counts, dtype: int64