numpy Pandas打滚:聚合布尔值

vbopmzt1  于 2022-12-13  发布在  其他
关注(0)|答案(3)|浏览(174)

在panda.DataFrame中是否有滚动的“any”函数?或者在滚动函数中是否有其他方法来聚合布尔值?
请考虑:

import pandas as pd
import numpy as np

s = pd.Series([True, True, False, True, False, False, False, True])

# this works but I don't think it is clear enough - I am not
# interested in the sum but a logical or!
s.rolling(2).sum() > 0  

# What I would like to have:
s.rolling(2).any()
# AttributeError: 'Rolling' object has no attribute 'any'
s.rolling(2).agg(np.any)
# Same error! AttributeError: 'Rolling' object has no attribute 'any'

那么,当聚合布尔值时,我可以使用哪些函数呢?(如果numpy.any不起作用)https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.DataFrame.rolling.html中的滚动文档声明,返回“特定操作的Window或Rolling子类”,这实际上没有什么帮助。

3pvhb19x

3pvhb19x1#

可以按如下方式聚合布尔值:

# logical or
s.rolling(2).max().astype(bool)

# logical and
s.rolling(2).min().astype(bool)

要处理不完整窗口中的NaN值,可以在类型转换之前使用适当的fillna,或者使用rollingmin_periods参数。这取决于要实现的逻辑。
遗憾的是,在Pandas身上做不到这一点,除非创造出作为浮动的中间值。

tez616oj

tez616oj2#

这个方法没有实现,关闭,你需要的是使用Rolling.apply

s = s.rolling(2).apply(lambda x: x.any(), raw=False)
print (s)
0    NaN
1    1.0
2    1.0
3    1.0
4    1.0
5    0.0
6    0.0
7    1.0
dtype: float64

s = s.rolling(2).apply(lambda x: x.any(), raw=False).fillna(0).astype(bool)
print (s)
0    False
1     True
2     True
3     True
4     True
5    False
6    False
7     True
dtype: bool

这里最好使用strides-生成numpy二维数组并稍后处理:

s = pd.Series([True, True, False, True, False, False, False, True])

def rolling_window(a, window):
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
    strides = a.strides + (a.strides[-1],)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)

a = rolling_window(s.to_numpy(), 2)
print (a)
[[ True  True]
 [ True False]
 [False  True]
 [ True False]
 [False False]
 [False False]
 [False  True]]

print (np.any(a, axis=1))
[ True  True  True  True False False  True]

这里第一个NaN sPandas值被省略了,可以添加第一个值进行处理,这里False s:

n = 2
x = np.concatenate([[False] * (n), s])

def rolling_window(a, window):
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
    strides = a.strides + (a.strides[-1],)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
a = rolling_window(x, n)
print (a)
[[False False]
 [False  True]
 [ True  True]
 [ True False]
 [False  True]
 [ True False]
 [False False]
 [False False]
 [False  True]]

print (np.any(a, axis=1))
[False  True  True  True  True  True False False  True]
z9gpfhce

z9gpfhce3#

def function1(ss:pd.Series):
    df1.loc[ss.index,'col1']=any(df1.loc[ss.index].col)
    return 0

df1=pd.DataFrame(s,columns=['col'])
df1.assign(col1=df1.index).col.rolling(2).apply(function1)
df1

    col   col1
0   True   True
1   True   True
2  False   True
3   True   True
4  False  False
5  False  False
6  False   True
7   True   True

相关问题