【问题标题】:Efficient way to encode a dataframe into a tree-like, nested-if structure?将数据帧编码为树状嵌套if结构的有效方法?
【发布时间】:2020-05-05 14:23:40
【问题描述】:

假设我有一个看起来像这样的pandas 数据框:

 A   B   C   D   value
 1   4   6   9   100
 1   4   6   10  101
 1   5   7   9   100
 1   5   7   11  102
 1   5   8   10  105

也就是说,有一些识别特征的组合唯一地识别一行,然后是一些值。在这种情况下,A, B, C, D 中有 4 个识别特征,这四个值的组合在数据帧中将是唯一的。

我想print下面嵌套if声明:

if A == 1
    if B == 4
        if C == 6
            if D == 9
                100
            if D == 10
                101
    if B == 5
        if C == 7
            if D == 9
                100
            if D == 11
                102
        if C == 8
            if D == 10
                105

假设我知道识别列已经按基数递增的顺序排列,那么将具有可变数量标识符 A, B, ... 的数据编码为这种格式的有效方法(就存储字符串所需的内存而言)是什么?

and 也是允许的,所以我也可以像这样表示树:

if A == 1
    if B == 4 and C == 6
        if D == 9
            100
        if D == 10
            101
    if B == 5
        if C == 7
            if D == 9
                100
            if D == 11
                102
        if C == 8 and D == 10
            105

会为后者欣喜若狂,但实现前者的解决方案已经解决了我的问题!

这是我拼凑的df 示例:

pd.DataFrame({'A': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3], 
              'B': [4, 4, 5, 5, 5, 4, 4, 4, 4, 5, 4, 5, 5, 5, 5], 
              'C': [6, 6, 7, 7, 8, 6, 7, 7, 7, 8, 6, 7, 8, 8, 8], 
              'D': [9, 10, 9, 11, 10, 12, 12, 13, 15, 10, 9, 10, 9, 16, 17],
              'value': [100, 101, 100, 102, 105, 103, 103, 100, 101, 107, 102, 100, 111, 105, 109]})

【问题讨论】:

    标签: python recursion data-structures encoding tree


    【解决方案1】:

    好的,所以这不是您所要求的,但我认为它值得考虑。

    也许您可以训练一个决策树分类器。然后,您可以导出树,然后编写一些自定义代码将树转换为 if 语句,这应该是直截了当的。这是我正在修改的一些代码:

    import pandas as pd
    from sklearn import tree
    from graphviz import Source
    import numpy as np
    
    data = pd.DataFrame({'A': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3], 
                         'B': [4, 4, 5, 5, 5, 4, 4, 4, 4, 5, 4, 5, 5, 5, 5], 
                         'C': [6, 6, 7, 7, 8, 6, 7, 7, 7, 8, 6, 7, 8, 8, 8], 
                         'D': [9, 10, 9, 11, 10, 12, 12, 13, 15, 10, 9, 10, 9, 16, 17], 
                         'value': [100, 101, 100, 102, 105, 103, 103, 100, 101, 107, 102, 100, 111, 105, 109]})
    
    
    X = data[['A', 'B', 'C', "D"]]
    Y = data["value"]
    
    clf = tree.DecisionTreeClassifier()
    clf = clf.fit(X, Y)
    
    # Display Tree
    classes = Y.unique().astype(np.str)
    Source( tree.export_graphviz(clf, out_file=None, feature_names=X.columns, class_names=classes) ) 
    

    【讨论】:

    • 有趣。谢谢你的建议 - 我会试试这个
    猜你喜欢
    • 2021-04-13
    • 1970-01-01
    • 2023-03-30
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 2016-04-09
    相关资源
    最近更新 更多