计算Pandas df的滑动窗口中值

0yycz8jy  于 2023-03-28  发布在  其他
关注(0)|答案(1)|浏览(141)

这是link的后续问题
下面是df

df = pd.DataFrame({'col1':[1,2,3,4,5,6,7,8,9,10],
                'col2':[10,15,20,25,30,35,40,45,50,55],
                'col3':['A','A','A','A','B','B','B','B','B','B']})

我想计算每一行'window'col1col2的中值。为此,我有以下函数:

def calculate_median_val(df, window):
    return df.groupby(np.arange(len(df))//window)['col1','col2'].median()

此功能存在两个问题:
1.返回的df不包含col3。我知道我们不能计算字符串的中位数,但我如何确保它仍然存在?预期的df如下:
如果window = 2:预期返回的df为:

col1 col2 col3
0   1.5 12.5 A
1   3.5 22.5 A 
2   5.5 32.5 B
3   7.5 42.5 B
4   9.5 52.5 B

然而,如果window=3,那么在col3第二个窗口中,将有'A','B','B'。理想情况下,我希望保持'B',因为它是大多数,但现在不是很关键,它可以是'A''B'
1.当我运行上面的函数时,它会给出一个未来警告:
未来警告:使用多个键(隐式转换为键元组)的索引将被弃用,请使用列表。
我认为这是由于传递了多个参数来计算中值。

qyyhg6bp

qyyhg6bp1#

你可以通过指定col1的函数来传递GroupBy.agg,比如GroupBy.firstGroupBy.last

df = pd.DataFrame({'col1':[1,2,3,4,5,6,7,8,9,10],
                'col2':[10,15,20,25,30,35,40,45,50,55],
                'col3':['A','A','A','A','B','B','B','B','B','B']})

def calculate_median_val(df, window):
    return (df.groupby(np.arange(len(df))//window)
               .agg({'col1':'median', 'col2':'median', 'col3':'first'}))

print (calculate_median_val(df, 2))
   col1  col2 col3
0   1.5  12.5    A
1   3.5  22.5    A
2   5.5  32.5    B
3   7.5  42.5    B
4   9.5  52.5    B

如果需要,可以对B进行优先级排序,创建有序分类并按max进行聚合:

def calculate_median_val(df, window):
    df['col3'] = pd.Categorical(df['col3'], ordered=True, categories=['A','B'])
    return (df.groupby(np.arange(len(df))//window)
              .agg({'col1':'median', 'col2':'median', 'col3':'max'}))

print (calculate_median_val(df, 3))

   col1  col2 col3
0     2    15    A
1     5    30    B
2     8    45    B
3    10    55    B

相关问题