我有一个文件,其中包含一些Order_ID及其Externsion_ID(如果存在)。新订单可以是新订单,也可以是现有Order_ID的扩展或现有扩展的扩展。
我的问题是添加一个名为Parent_ID的新列,该列标记了Order_ID的根。
请找到以下预期输出:
以下是可复制的输入。
train = pd.read_csv('data/train.csv', dtype = dtypes)
test = pd.read_csv('data/test.csv')
test.head()
X = train.iloc[:10000, 3:-1].values
y = train.iloc[:10000, -1].values
sc = StandardScaler()
X = sc.fit_transform(X)
#pca = PCA(0.95)
#X = pca.fit_transform(X)
d_train = lgb.Dataset(X, label=y)
params = {}
params['learning_rate'] = 0.003
params['boosting_type'] = 'gbdt'
params['objective'] = 'binary'
params['metric'] = 'binary_logloss'
params['sub_feature'] = 0.5
params['num_leaves'] = 10
params['min_data'] = 50
params['max_depth'] = 10
num_round = 10
clf = lgb.train(params, d_train, num_round, verbose_eval=1000)
X_test = sc.transform(test.iloc[:100,3:].values)
pred = clf.predict(X_test, num_iteration = clf.best_iteration)
答案 0 :(得分:1)
以下是基于igraph
的解决方案:
library(igraph) # 1.2.1
v <- data.frame(name = unique(unlist(df1)), stringsAsFactors = FALSE)
v <- v[!is.na(v$name), ]
g <- graph_from_data_frame(df1[!is.na(df1$Extension_Of), 2:1], vertices = v)
df1$Parent_ID <- sapply(df1$Order_ID, function(oid){
n <- ego(g, order = nrow(df1), oid, mode = 'in')[[1]]
nin <- lapply(n, function(x){ego(g, order = nrow(df1), x, mode = 'in')[[1]]})
root <- n[lengths(nin) == 1]$name
})
df1[df1$Parent_ID == 'SL384', ]
# Order_ID Extension_Of Parent_ID
# 113 SL384 <NA> SL384
# 138 SL11995 SL10046 SL384
# 170 SL10046 SL384 SL384
此答案的灵感来自this answer和this function。
基本原理:df1中没有NA的每条线都可以视为图形中的一条边。如果B是A的扩展,则边A->B。如果C是B的扩展,则得到B-> C。然后可以将该问题表述为:对于每个节点(Order_ID),找到其根节点。对于C,由于(A-> B-> C),其根节点为A。
在上面的代码中,对于Order_ID
,ego
查找直接或间接位于其上游(包括自身)的所有节点。在这些上游节点中,我们可以确定根节点是没有其他上游节点的根节点。