熊猫数据框,分组依据,滚动窗口,然后统计

时间:2019-03-14 17:13:25

标签: python pandas dataframe group-by

我有一个带有两列A和B的数据框,都是整数。在A中,它们被重复。我按它们分组,然后按它们排序,然后我想在A上应用滚动窗口以对B列中的元素进行分组。它们的分组方式并不重要,任何事情都可以做,然后我必须对它们做很多事情,因此我很可能需要将该集合转换为其他集合(pandas.Series可能是最好的串联组)在每个窗口中。)

我认为我必须从这样的事情开始:

df.groupby('A').rolling(w)

但是如何获取元素?

我尝试使用apply,但是我只得到一个窗口作为一个numpy数组,而不是一个跨组的窗口。

示例:

In [1]: import pandas as pd
   ...: import numpy as np
   ...: import random
   ...: 
   ...: random.seed(2)
   ...: 
   ...: indexes = [i for i in range(1,100) for _ in range(10)]
   ...: dfi = pd.DataFrame({'A': indexes, 'B': [random.randint(1,99) for e in indexes]})
   ...: print(dfi.head()) # this is an input example
   A   B
0  1   8
1  1  12
2  1  11
3  1  47
4  1  22
In [2]: result = []
   ...: w = 3
   ...: for i in range(1,100):
   ...:     result.append({'A': i, 'B': np.array([e for j, e in dfi.values if abs(i-j) < w or abs(min(i,j)+99-max(i,j)
   ...: ) < w])})
   ...: dfo = pd.DataFrame(result) # this is the expected output, to be obtained with groupby and rolling operations
   ...: print(dfo.head())
   A                                                  B
0  1  [8, 12, 11, 47, 22, 95, 86, 40, 33, 78, 28, 78...
1  2  [8, 12, 11, 47, 22, 95, 86, 40, 33, 78, 28, 78...
2  3  [8, 12, 11, 47, 22, 95, 86, 40, 33, 78, 28, 78...
3  4  [28, 78, 5, 75, 88, 21, 56, 82, 51, 93, 66, 48...
4  5  [66, 48, 70, 57, 65, 35, 5, 4, 47, 60, 41, 49,...

请注意,每个数组中有50个元素,每个组中有10个元素,然后窗口大小为5(3个半径,不包括在内)

1 个答案:

答案 0 :(得分:2)

这是使用聚合的解决方案:

dfo = dfi.groupby('A').agg(lambda x: list(x))
dfo.head()
                                               B
    A                                           
    1    [8, 12, 11, 47, 22, 95, 86, 40, 33, 78]
    2    [28, 78, 5, 75, 88, 21, 56, 82, 51, 93]
    3     [66, 48, 70, 57, 65, 35, 5, 4, 47, 60]
    4    [41, 49, 55, 68, 22, 72, 23, 31, 30, 4]
    5   [23, 42, 23, 18, 66, 66, 47, 66, 87, 72]

您可以通过访问DataFrameGroupBy对象中的列“ B”来返回Series而不是DataFrame,如下所示:

dfo = dfi.groupby('A')['B'].apply(lambda x: list(x))