删除组中的子字符串父级

2024-04-27 00:30:39 发布

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

我有一个熊猫数据帧结构如下:

col1  col2 
A     C1.123
A     C1.123.89
B     D0.3
B     E98

col2表示树结构数据,例如C1.123.89C1.123的子节点。请注意,col2条目的深度可以达到11级,例如D09.123.908.90.12.123.982.321.23.12

可以在here中找到一个小数据集。你知道吗

我想“挤压”上面的数据帧,以便每个col1组只包含最深的节点(父节点被移除)。所以,我希望输出

col1  col2 
A     C1.123.89
B     D0.3
B     E98

到目前为止,我都是这样处理的

def has_children(df, col):
    all_vals = df[col].tolist()
    return df[col].map(lambda x: any([x+'.' in l for l in all_vals]))

for col1, group in merge.groupby('col1'):
    merge.loc[merge.col1==col1,'has_children'] = has_children(group, 'col2')

我的封套后面的计算表明,这应该需要大约6小时来运行我的百万行左右。有没有更有效的方法?你知道吗


Tags: 数据indffor节点groupcolmerge
1条回答
网友
1楼 · 发布于 2024-04-27 00:30:39

如果没有数据集的完整树级别,我不确定这是否更快。它本质上只是查看哪些子字符串对于col1中的每个单独的值都是自身的子集。你知道吗

def g(x):
    split_lists =[set(x.split('.')) for x in x]
    keep_list = []
    for i in range(len(split_lists)):
        keep = [split_lists[i].issubset(item) for item in split_lists]
        only_one = sum(keep) == 1
        keep_list.append(only_one)
    return keep_list

df[df.groupby('col1')['col2'].transform(g)]

相关问题 更多 >