Предположим, у вас есть кадр данных, как показано ниже (я добавил имена столбцов для удобства чтения)
df
Cat1 Cat2 Relationship
0 a b 3.0
1 b c 2.0
2 c d 1.5
Первое слияние df
само по первым 2 столбцам и вычислите новое значение отношения, умножив исходные 2 значения отношенияна объединенном ряду. Повторяйте то же самое, пока все отношения не достигнут.
import pandas as pd
df = pd.DataFrame(data=[['a', 'b', 3],
['b', 'c', 2],
['c', 'd', 1.5]],
columns=['Cat1', 'Cat2', 'Relationship'])
max_length_of_relationships = len(df)
for i in range(max_length_of_relationships):
df2 = df.merge(df, left_on='Cat2', right_on='Cat1')
df2['Relationship'] = df2['Relationship_x'] * df2['Relationship_y']
df2 = df2[['Cat1_x', 'Cat2_y', 'Relationship']]
df2.columns = ['Cat1', 'Cat2', 'Relationship']
df = df.append(df2).drop_duplicates()
, что приводит к
df
Cat1 Cat2 Relationship
0 a b 3.0
1 b c 2.0
2 c d 1.5
0 a c 6.0
1 b d 3.0
1 a d 9.0
Хитрость здесь в том, что я предположил, что max_length_of_relationships
- это число строк в кадре данных, котороена самом деле худший вариант развития событий. Если у вас большой фрейм данных, а max_length_of_relationships невелик, производительность будет плохой. В этом случае вам может понадобиться использовать networkx , как предложено @Quang, чтобы найти самый длинный путь в графе.
Пример кода
import networkx as nx
G=nx.from_pandas_edgelist(df, 'Cat1', 'Cat2', edge_attr=True, create_using=nx.DiGraph())
print(nx.dag_longest_path(G))
max_length_of_relationships = nx.dag_longest_path_length(G)