将一个pandas数据帧分组为一列或另一列

时间:2018-04-19 10:04:06

标签: python pandas numpy dataframe

这是我的数据框:

df = pd.DataFrame({'name' : ['name1', 'name2', 'name1', 'name3'],
                    'rate' : [1,2,2,3],
                    'id' : range(4)})

   id   name  rate
0   0  name1     1
1   1  name2     2
2   2  name1     2
3   3  name3     3

我想将pandas数据帧的行分组,如果它们在列name或列rate中具有相同的值。

          id            name       rate
0  [0, 1, 2]  [name1, name2]  [1, 2, 2]
1        [3]           name3        [3]

我有一个庞大的数据框,所以我不想迭代每一行(除非这是唯一的解决方案)。我该怎么办?

(我可以使用Numpy数组而不是Pandas数据帧)

1 个答案:

答案 0 :(得分:2)

你的条件是无限传递的。在行 2i,2i + 1 中说明共享名称,并且在行 2i + 1,2i + 2 中共享费率,您需要保持链接行。

解决此问题的一种方法是使用graph theory's connected components algorithm

enter image description here

为此,您可以使用networkx。在代码中,它可以如下:

group

让我们创建一个df['group'] = df['id'].map( dict(itertools.chain.from_iterable([[(ee, i) for ee in e] for (i, e) in enumerate(nx.connected_components(G))]))) >>> df.group 0 0 1 0 2 0 3 1 列,为每一行指示其组:

groupby

现在您只需要list组列,然后应用=IFERROR(MATCH(1,ISNUMBER(SEARCH(B2,$A$1:$A$4,1))*ISNUMBER(SEARCH(C2,$A$1:$A$4,1)),0),"No match")