所以,我有一个这样的数据框:
A,B,C,D
foo,something,2019-01-04 09:56:01,True
bar,something,2019-01-05 8:15:09,True
bar,something,2019-01-05 10:15:10,False
bar,something,2019-01-07 10:15:10,False
baz,something,2019-02-07 10:15:38,True
bar,somethingelse,2019-02-09 11:42:16,False
foo,something,2019-05-04 11:44:56,True
foobar,something,2019-07-15 13:23:09,True
foo,something,2019-08-04 11:44:56,False
foobar,something,2019-08-05 13:23:09,False
foobarbaz,something,2019-08-05 13:23:10,True
我想计算2个新列:
首先,在“ B”的值与所考虑的行(包括所考虑的行)的值相同的滚动时间窗口(假设2天)内,“ A”的先前不同值的数量计数)。
第二,在同一滚动时间窗内,“ A”的先前不同值的数量,其中“ B”的值与当前行的值相同,而“ D”的值为“ True”。
所需的输出将是:
A,B,C,D,F,G
foo,something,2019-01-04 09:56:01,True,1,1
bar,something,2019-01-05 8:15:09,True,2,2
bar,something,2019-01-05 10:15:10,False,2,2
bar,something,2019-01-07 10:15:10,False,1,1,0
baz,something,2019-02-07 10:15:38,True,1,1
bar,somethingelse,2019-02-09 11:42:16,False,1,0
foo,something,2019-05-04 11:44:56,True,1,1,1
foobar,something,2019-07-15 13:23:09,True,1,1
foo,something,2019-08-04 11:44:56,False,1,0
foobar,something,2019-08-05 13:23:09,False,2,0
foobarbaz,something,2019-08-05 13:23:10,True,3,1
对于第一部分(计算列F),我的答案是:
df["F"] = pd.factorize(df["A"])[0]
result = df.groupby("B").rolling("2D", on="C").F.apply(lambda x: len(np.unique(x)))
然后我可以重新合并到B和C列的df中(C中的日期时间都是不同的)。它给出了预期的结果。
但是对于G列,我找不到解决方案。在应用与上述相同的两行之前对df(df.loc [df.D])进行过滤不是正确的解决方案,因为“ D”为“ False”的行仍可以具有其为“ True”的先前行”。 因此,通过该方法(合并后)获得的输出为:
A,B,C,D,F,G
foo,something,2019-01-04 09:56:01,True,1,1
bar,something,2019-01-05 8:15:09,True,2,2
bar,something,2019-01-05 10:15:10,False,2,NaN
bar,something,2019-01-07 10:15:10,False,1,1,NaN
baz,something,2019-02-07 10:15:38,True,1,1
bar,somethingelse,2019-02-09 11:42:16,False,1,NaN
foo,something,2019-05-04 11:44:56,True,1,1
foobar,something,2019-07-15 13:23:09,True,1,1
foo,something,2019-08-04 11:44:56,False,1,NaN
foobar,something,2019-08-05 13:23:09,False,2,NaN
foobarbaz,something,2019-08-05 13:23:10,True,3,1
非NaN值是正确的,但是我不能只将这些NaN(与所需的输出进行比较)fillna(),所以这种方法似乎有缺陷。
感谢您的帮助。