我有一个带有两列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个半径,不包括在内)
答案 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))