我有一个看起来像这样的Pandas数据框:
其中,a, b, c, d
是分类变量,例如a < b < c < d
和b > 3 * a
,c > 2 * b
和d > 1.5 * c
。如果给出了这些显式关系,如何将具有所有其他隐式关系(如c > 6 * a
,d > 9 * a
和d > 3 * b
)的行添加到此数据框。
有任何想法吗?
最佳答案
假设您有一个如下所示的数据框(我添加了列名以提高可读性)
df
Cat1 Cat2 Relationship
0 a b 3.0
1 b c 2.0
2 c d 1.5
首先在前两列上合并
df
本身,然后通过将合并后的行上的原始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较小时数据帧较大,则性能会很差。在这种情况下,您可能需要使用@Quang建议的networkx来找到图形中的最长路径。代码示例
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)