熊猫滚动时间窗口具有多种条件的不重复计数

时间:2019-09-25 18:15:50

标签: python python-3.x pandas

所以,我有一个这样的数据框:

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(),所以这种方法似乎有缺陷。

感谢您的帮助。

0 个答案:

没有答案