Pandas dataframe,Filter和递归搜索

uoifb46i  于 2023-08-01  发布在  其他
关注(0)|答案(2)|浏览(89)

我想过滤一个pandas dataframe并以递归的方式添加一些数据。
数据框显示“级别”中的层次结构。级别1是父级别,2到n是级别1的子级别。


的数据
我尝试做的是过滤[Status]中所有带有'E'或'V'的行。

data = {
    "Level": [1, 2, 2, 2, 3, 2, 3, 3, 4],
    "Status": ["-", "-", "E", "-", "-", "V", "-", "-", "-"],
    "Item": ["Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "Item 6", "Item 7", "Item 8", "Item 9"]
}

# Load data into a DataFrame object:
df = pd.DataFrame(data)

# Create a new DataFrame by filtering rows with Status "E" or "V"
filtered_df = df.loc[df['Status'].isin(['E', 'V'])].copy()

字符串
然后我想添加每个子级的父级,以便只显示行0、2、3、4、5。



有人能帮帮我吗?
最好的问候,迈克

e4yzc0pl

e4yzc0pl1#

IIUC,你不需要递归,你可以简单地以相反的顺序迭代,跟踪最后符合你的条件的级别:

def filter_indices(df):
    last_level = set()
    keep = set()
    for i, l, s in zip(df.index[::-1],
                       df.loc[::-1, 'Level'],
                       df.loc[::-1, 'Status'].isin(['V', 'E'])):
        if s:
            keep.add(i)
            last_level.add(l)
        if l+1 in last_level:
            keep.add(i)
            last_level.add(l)
            last_level.remove(l+1)
    return list(keep)

out = df.loc[filter_indices(df)]

字符串

  • 注意,如果不是第一个reset_index,则假设唯一索引。

输出量:

Level Status    Item
0      1      -  Item 1
2      2      E  Item 3
3      2      -  Item 4
4      3      E  Item 5
5      2      V  Item 6

变量也可以获取匹配的子级:

def filter_indices(df):
    last_level = {}
    keep = set()
    children = {}
    for i, l, s in zip(df.index[::-1],
                       df.loc[::-1, 'Level'],
                       df.loc[::-1, 'Status'].isin(['V', 'E'])):
        if s:
            keep.add(i)
            last_level[l] = i
        if l+1 in last_level:
            children[i] = last_level[l+1]
            keep.add(i)
            last_level[l] = i
            del last_level[l+1]
    return list(keep), children

idx, children = filter_indices(df)

out = df.loc[idx].assign(child_idx=children)


输出量:

Level Status    Item  child_idx
0      1      -  Item 1        2.0
2      2      E  Item 3        NaN
3      2      -  Item 4        4.0
4      3      E  Item 5        NaN
5      2      V  Item 6        NaN

lx0bsm1f

lx0bsm1f2#

作品完美,非常感谢!

相关问题