给定一个随机数据集,我需要找到与第一行相关的行。
|Row|Foo|Bar|Baz|Qux|
|---|---|---|---|---|
| 0 | A |A🔴 |A | A |
| 1 | B | B | B | B |
| 2 | C | C | C |D🟠|
| 3 | D |A🔴 | D |D🟠|
我应该得到0、2和3的相关行,因为0['Bar'] == 3['Bar']
和3['Qux'] == 2['Qux']
。
我可以迭代列以获得相似性,但这将是缓慢和低效的,如果有新的相似性,我还需要再次迭代。
我希望有人能给我指明正确的方向,比如我应该关注哪个pandas
概念,或者哪些函数可以帮助我解决检索交叉数据的问题。我甚至需要使用pandas
吗?
编辑:
按照@goodside的建议提供解决方案。此解决方案将循环,直到找不到新的匹配索引为止。
table = [
['A', 'A', 'A', 'A'],
['B', 'B', 'B', 'B'],
['C', 'C', 'C', 'D'],
['D', 'A', 'D', 'D']
]
comparators = [0]
while True:
for idx_row, row in enumerate(table):
if idx_row in comparators:
continue
for idx_col, cell in enumerate(row):
for comparator in comparators:
if cell == table[comparator][idx_col]:
comparators.append(idx_row)
break
else:
continue
break
else:
continue
break
else:
break
for item in comparators:
print(table[item])
这是一个图形问题。您可以使用networkx
:
# get the list of connected nodes per column
def get_edges(s):
return df['Row'].groupby(s).agg(frozenset)
edges = set(df.apply(get_edges).stack())
edges = list(map(set, edges))
# [{2}, {2, 3}, {0, 3}, {3}, {1}, {0}]
from itertools import pairwise, chain
# pairwise is python ≥ 3.10, see the doc for a recipe for older versions
# create the graph
import networkx as nx
G = nx.from_edgelist(chain.from_iterable(pairwise(e) for e in edges))
G.add_nodes_from(set.union(*edges))
# get the connected components
list(nx.connected_components(G))
输出:[{0, 2, 3}, {1}]
注意。你可以在我的这个问题中阅读更多关于创建图形的逻辑
使用的输入:
df = pd.DataFrame({'Row': [0, 1, 2, 3],
'Foo': ['A', 'B', 'C', 'D'],
'Bar': ['A', 'B', 'C', 'A'],
'Baz': ['A', 'B', 'C', 'D'],
'Qux': ['A', 'B', 'D', 'D']})