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



假设我有一个看起来像这样的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]})

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

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

最新更新