如何使用python从嵌套表结构中识别最终父级?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何使用python从嵌套表结构中识别最终父级?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2839字,纯文字阅读大概需要5分钟。
内容图文
![如何使用python从嵌套表结构中识别最终父级?](/upload/InfoBanner/zyjiaocheng/685/b9ed5c4501e047c694961dc16f7c252b.jpg)
我有下表:
我的问题是:如何以编程方式确定最终父母?
以下是通过示例说明的规则:
> id 5.0的父级是51.0. ID 51.0没有父母.因此,id 5.0的最终父代为51.0.
> id 6.0的父代是1.0. id 1.0的父级是10.0. ID 10.0没有父母.因此,id 6.0的最终父代为10.0.
> id 2.0没有父项.因此,2.0的最终parent_id为2.0
id字段中没有重复项,我也不知道id结构中可以嵌套多少层.
这是此示例的代码:
import pandas as pd
import numpy as np
original_df = pd.DataFrame({'id': pd.Series([5., 6, 2, 51, 1, 70, 10])
,'parent_id': pd.Series([51, 1, np.nan, np.nan, 10, np.nan, np.nan])})
original_df['ultimate_parent_id'] = ''
original_df
这是决赛桌的样子:
这是用于生成该文件的代码.
final_df = pd.DataFrame({'id': pd.Series([5., 6, 2, 51, 1, 70, 10])
,'parent_id': pd.Series([51, 1, np.nan, np.nan, 10, np.nan, np.nan])})
final_df['ultimate_parent_id'] = pd.Series([51., 10, 2, 51, 10, 70, 10])
final_df
如果可能的话,我对使用while循环的解决方案以及使用矢量化运算的解决方案都将非常感兴趣.
解决方法:
与@Vaishali的回答一样,这是一个使用Python遍历主要操作,但在数据帧内使用np / pd操作的版本:
import pandas as pd
import numpy as np
df = pd.DataFrame(
{ 'id': pd.Series([5., 6, 2, 51, 1, 70, 10]),
'parent_id': pd.Series([51, 1, np.nan, np.nan, 10, 51, np.nan])
}
)
def find_ultimate_parents(df):
# Make a copy of df, using 'id' as the index so we can lookup parent ids
df2 = df.set_index(df['id'])
df2['nextpar'] = df2['parent_id']
# Next-parent-2 not null - fake it for now
np2nn = df2['nextpar'].notnull()
while np2nn.any():
# Lookup df2[parent-id], since the index is now by id. Get the
# parent-id (of the parent-id), put that value in nextpar2.
# So basically, if row B.nextpar has A, nextpar2 has (parent-of-A), or Nan.
# Set na_action='ignore' so any Nan doesn't bother looking up, just copies
# the Nan to the next generation.
df2['nextpar2'] = df2['nextpar'].map(df2['parent_id'], na_action='ignore')
# Re-evaluate who is a Nan in the nextpar2 column.
np2nn = df2['nextpar2'].notnull()
# Only update nextpar from nextpar2 if nextpar2 is not a Nan. Thus, stop
# at the root.
df2.loc[np2nn, 'nextpar'] = df2[np2nn]['nextpar2']
# At this point, we've run out of parents to look up. df2['nextpar'] has
# the "ultimate" parents.
return df2['nextpar']
df['ultimate_parent_id'] = find_ultimate_parents(df)
print(df)
循环防护检查np2nn.any(),它是布尔系列上的向量op.每次通过循环都会查找“下一个父级”,因此通过循环的次数将是任何子父链的最大深度.对于像1> 2> 3> 4…4…n的列表,O(N)中最坏的情况.对于没有父母的列表,最好的情况是0.
该循环使用na_action =’ignore’执行一个.map,以简单地传播Nan值.这是O(fast-N)乘以索引查找成本,应为O(1).
计算出nextpar2字段后,循环将使用一个简单的.notnull()重新计算np2nn,该值再次为O(fast-N).
最后,从nextpar2更新nextpar字段,该字段再次应为O(fast-N).
因此,最坏情况下的性能为O(slow-N * fast-N),即N²,但这是Pandas-N²,而不是Python-N².平均情况应为O(slow-m * fast-N),其中m是平均情况下的最大树深度,最好情况为1(1)快速通过行的O(fast-N).
内容总结
以上是互联网集市为您收集整理的如何使用python从嵌套表结构中识别最终父级?全部内容,希望文章能够帮你解决如何使用python从嵌套表结构中识别最终父级?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。