这是我的数据框:
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数据帧)
答案 0 :(得分:2)
你的条件是无限传递的。在行 2i,2i + 1 中说明共享名称,并且在行 2i + 1,2i + 2 中共享费率,您需要保持链接行。
解决此问题的一种方法是使用graph theory's connected components algorithm。
为此,您可以使用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")
。