Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将数据帧编码为树状嵌套if结构的有效方法?_Python_Recursion_Data Structures_Encoding_Tree - Fatal编程技术网

Python 将数据帧编码为树状嵌套if结构的有效方法?

Python 将数据帧编码为树状嵌套if结构的有效方法?,python,recursion,data-structures,encoding,tree,Python,Recursion,Data Structures,Encoding,Tree,假设我有一个pandasdataframe,看起来像这样: 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个识别特征,这四个值的组合在数据帧中是唯一的 我想打印以下嵌套的if语句: if

假设我有一个
pandas
dataframe,看起来像这样:

 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个识别特征,这四个值的组合在数据帧中是唯一的

我想打印以下嵌套的
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
假设我知道识别列已经按基数递增的顺序排列,那么用可变数量的标识符将数据编码成这种格式的有效方法(就存储字符串所需的内存而言)是什么

也是允许的,因此我也可以像下面这样表示树:

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
I:

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]})

好吧,这不是你想要的,但我认为值得考虑

也许你可以训练一个决策树分类器。然后可以导出树,然后编写一些自定义代码将树转换为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) ) 

有趣。谢谢你的建议,我会试试的