我有一个结构如下的熊猫数据框:
col1 col2
A C1.123
A C1.123.89
B D0.3
B E98
col2 表示树状结构的数据,例如C1.123.89
是C1.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')
我的信封背面计算结果显示,大约需要数百万个小时才能运行大约一百万行。有更有效的方法吗?
答案 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)]