删除熊猫组中的子字符串父项

时间:2018-06-19 14:21:48

标签: python performance pandas group-by pandas-groupby

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

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')

我的信封背面计算结果显示,大约需要数百万个小时才能运行大约一百万行。有更有效的方法吗?

1 个答案:

答案 0 :(得分:0)

没有数据集的完整树级别,我不确定这是否更快。本质上,它只是针对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)]