这是我的数据框:
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数据框的行进行分组,如果它们在columnname
或column中具有相同的值rate
。
id name rate
0 [0, 1, 2] [name1, name2] [1, 2, 2]
1 [3] name3 [3]
我有一个巨大的数据框,所以我不想遍历每一行(除非是唯一的解决方案)。我该怎么办 ?
(我可以使用Numpy数组代替Pandas数据框)
您的条件无限制地传递。如果在第2i,2i + 1行中共享名称,在第2i + 1、2i + 1行中共享速率,则需要保持链接行。
解决这一问题的一种方法是使用图论的连通分量算法。
为此,您可以使用networkx
。在代码中,可能如下所示:
import networkx as nx
import itertools
G = nx.Graph()
G.add_nodes_from(df.id)
G.add_edges_from(
[(r1[1]['id'], r2[1]['id']) for (r1, r2) in itertools.product(df.iterrows(), df.iterrows()) if r1[1].id < r2[1].id and (r1[1]['rate'] == r2[1]['rate'] or r1[1]['name'] == r2[1]['name'])]
)
让我们创建一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
在group列上应用即可list
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句