滚动窗口中不同的一对

2024-09-29 18:48:25 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我正在尝试计算端口到地址之间的不同对值。你知道吗

基本上就是这个场景,我希望滚动计数是当行进入窗口时端口和地址值出现的次数。你知道吗

Count distinct strings in rolling window using pandas + python (with a condition)

然而,问题的答案是不正确的,没有后续的解决办法。你知道吗

假设我有桌子

ID  PORT    ADDRESS  
1    21     ad3  
2    22     ad1       
3    23     ad2      
4    23     ad2            
5    21     ad4            
6    22     ad1            
7    22     ad1            
8    21     ad4  

例如,如果我的窗口大小为3,我想要的输出将是

 ID  PORT    ADDRESS  rolling_count
 1    21     ad3            1
 2    22     ad1            1
 3    23     ad2            1
 4    23     ad2            2
 5    21     ad4            1
 6    22     ad1            1
 7    22     ad1            2
 8    21     ad4            1

链接后的答案似乎不仅仅在窗口内计算

df['rolling_count']=df.groupby('ADDRESS').PORT.apply(lambda x : pd.Series(x).rolling(3,min_periods=1).apply(lambda y: len(set(y))))

是我尝试使用的,但不正确。这就是它的输出

 ID  PORT    ADDRESS  rolling_count
 1    21     ad3            1
 2    22     ad1            1
 3    23     ad2            1
 4    23     ad2            1
 5    21     ad4            1
 6    22     ad1            1
 7    22     ad1            1
 8    21     ad4            1

任何反馈都是有用的。你知道吗


Tags: 端口lambda答案iddfportaddress地址
1条回答
网友
1楼 · 发布于 2024-09-29 18:48:25

对于您的应用程序,您可以选择按顺序计算端口和地址的重复值 样品测向

ID  PORT    ADDRESS
0   1   21  ad3
1   2   22  ad1
2   3   23  ad2
3   4   23  ad2
4   5   21  ad4
5   6   22  ad1
6   7   22  ad1
7   8   22  ad1

x = df.PORT.astype(str) + df.ADDRESS
x = (x.eq(x.shift())+ x.eq(x.shift(-1))).astype(int)
a = x == 1
b = a.cumsum()
arr = np.where(a, b-b.mask(a).ffill().fillna(0).astype(int), 1)

出去

array([1, 1, 1, 2, 1, 1, 2, 3])

滚动窗口实际上保持(windowlength-1)重复窗口的顺序w.r.t窗口长度你选择,这导致计数值在不同的地方。你知道吗

from collections import Counter
def unique_values(x,window):
    # External numpy array to generate windows
    a = (np.arange(window)[None, :] + np.arange(len(x))[:, None])-(window-1)
    b = np.where(a<0,0,a)
    return [max(Counter(i).values()) for i in np.where(a<0,a,x.values.take(a))]
unique_values(df.PORT.astype(str) +df.ADDRESS,3)    

输出:

[1, 1, 1, 2, 2, 1, 2, 2]

相关问题 更多 >

    热门问题