使用窗口和层次结构逻辑创建带Pandas的计算列

2024-09-28 22:31:50 发布

您现在位置:Python中文网/ 问答频道 /正文

给出以下示例,如何创建计算列“parent_node”

import pandas as pd

#create dataframe with just node column
df = pd.DataFrame({
    "node": [
        "N07 S40 G S06 S29 G N13", "N07", "N07 S28", "N07 S28 G N06 S16",
        "N08 N05", "N07 S28 G N05", "N08 N05 G N27", "N07 S28 G N05 N03",
        "N07 S28 G N05 N03 G S31", "N07 S28 G N06 S16 G S32"
    ]
})

#create column called count_of_spaces_in_node
def countSpaces(cell):
    try:
        return cell.count(" ")
    except:
        return 0
df["count_of_spaces_in_node"] = df["node"].apply(countSpaces)

#sort by count_of_spaces_in_node, then by node
df = df.sort_values(by=["count_of_spaces_in_node", "node"])

#reset index
df = df.reset_index(drop=True)

#create column called length_of_node
df['length_of_node'] = df['node'].str.len()

生成的df如下所示:

^{tb1}$

名为“父节点”的新计算列如下所示:

^{tb2}$

以下是以最后一行为例创建父节点列的逻辑:

  1. 查看我们正在考虑的行的\u节点值中的\u空间\u的计数\u:
^{tb3}$

值为6。现在看看这个层次结构:

hierarchy_distinct_count_of_spaces_in_node = df.count_of_spaces_in_node.unique()
#result: array([0, 1, 3, 4, 6], dtype=int64)
  1. 在层次结构中从6上升到4。现在查看表格的一个窗口,其中节点中的空间计数等于4:
^{tb4}$

在这个窗口中的每一行中,考虑节点和LangthyOf节点。将该节点与原始节点的左长度\u node-number-of-characters进行比较。(例如N07 S28 G N05 N03=N07 S40 G S06 S29?否)如果存在匹配项,则此节点将成为父节点列的值

  1. 如果在浏览了4-window中的所有行之后没有得到任何匹配项,则将层次结构从4向上移动到3。现在重复步骤2,但对窗口使用3,如下所示:
nodecount_of_spaces_in_nodelength_of_node
N07 S28 G N05313
N08 N05 G N27313

在这个窗口中的每一行中,考虑节点和LangthyOf节点。将该节点与原始节点的左长度\u node-number-of-characters进行比较。(例如N07 S28 G N05=N07 S40 G S06?否)如果存在匹配项,则此节点将成为父节点列的值

  1. 如果在浏览了3-window中的所有行之后没有得到任何匹配项,则将层次结构从3向上移动到1。现在重复步骤2,但窗口使用1,如下所示:
nodecount_of_spaces_in_nodelength_of_node
N07 S2817
N08 N0517

在这个窗口中的每一行中,考虑节点和LangthyOf节点。将该节点与原始节点的左长度\u node-number-of-characters进行比较。(例如N07 S28=N07 S40?否)如果存在匹配项,则此节点将成为父节点列的值

  1. 如果在浏览了1窗口中的所有行后没有得到任何匹配项,则将层次结构从1向上移动到0。现在重复步骤2,但对窗口使用0,如下所示:
nodecount_of_spaces_in_nodelength_of_node
N0703

在这个窗口中的每一行中,考虑节点和LangthyOf节点。将该节点与原始节点的左长度\u node-number-of-characters进行比较。(例如,N07=N07是否?是!因此N07将成为父节点值。)如果没有匹配项,在考虑最后一个0窗口后,将父节点保留为空或NULL

旁注:这可能对回答上述问题没有帮助,但可能是一个有趣的上下文。我正在为我正在研究的game design做一些an opening book AI分析


Tags: ofinnodedf节点层次结构countlength
1条回答
网友
1楼 · 发布于 2024-09-28 22:31:50

假设N08 N05 G N27将有一个父节点,因为N08 N05生成了下面的代码段

试试下面的代码片段

df = pd.DataFrame({
    "node": [
        "N07 S40 G S06 S29 G N13", "N07", "N07 S28", "N07 S28 G N06 S16",
        "N08 N05", "N07 S28 G N05", "N08 N05 G N27", "N07 S28 G N05 N03",
        "N07 S28 G N05 N03 G S31", "N07 S28 G N06 S16 G S32"
    ]
})


node_list = [i.split() for i in df["node"]]

def find_par_node(x):
    
    lis = x.split(" ")
    for i in range(-1,-len(lis),-1):
        if (lis[:i] in node_list):
            return " ".join(lis[:i])
    return np.nan
    
df["parent_node"] = df["node"].apply(find_par_node)

print(df)

    node                     parent_node
N07 S40 G S06 S29 G N13      N07
N07                          NaN
N07 S28                      N07
N07 S28 G N06 S16            N07 S28
N08 N05                      NaN
N07 S28 G N05                N07 S28
N08 N05 G N27                N08 N05
N07 S28 G N05 N03            N07 S28 G N05
N07 S28 G N05 N03 G S31      N07 S28 G N05 N03
N07 S28 G N06 S16 G S32      N07 S28 G N06 S16

相关问题 更多 >