python - Pandas 中分类变量的顺序

标签 python pandas

我有一个 Pandas 数据框,如下所示:

Input DataFrame

其中,a, b, c, d是分类变量,使得 a < b < c < db > 3 * a , c > 2 * bd > 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

首先在前 2 列上合并 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 很小,则性能会很差。在这种情况下,您可能需要使用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)

关于python - Pandas 中分类变量的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58332903/

相关文章:

python - 无法使用 psycopg2 在 postgres 中插入无值

python - 如何生成范围列表以从 pandas 数据框中获取行子集?

python - iterrows() 需要几个小时才能运行,如何加快速度?

python - 从 csv 文件创建数据框,其中列表作为其中一列中的条目

python - 对视频进行二次采样以保存每 N 帧

python - 删除值跨列交换的重复行

python - JSON 提取到 pandas 数据帧

python - Pandas boolean DataFrame 选择歧义

python - 将多个 if 语句放入 python pandas 的一个 if 语句中

python - 可以在仅选择右侧第一个匹配项的 Pandas 中执行左连接吗?