python - 用 Pandas 或 Pyspark 用两列表示的关系展平“树”
问题描述
我收集了类似于以下格式的家谱:
A
/ \
B C
/ \ / \
D E F G
/ \
.. ..
在以下两列(包含多棵树)中表示:
孩子 | 父母 |
---|---|
一个 | |
乙 | 一个 |
C | 一个 |
D | 乙 |
... | ... |
将其展平以便在新列中获得最高父级的最有效方法是什么?
即B = A,D = A ...?
孩子 | 父母 | 最高父 |
---|---|---|
一个 | 一个 | |
乙 | 一个 | 一个 |
C | 一个 | 一个 |
D | 乙 | 一个 |
... | ... | ... |
理想情况下,我想在 Spark 中执行此操作(鉴于数据集的大小),但也可以尝试 Pandas?
如果每个级别没有一些非常密集的递归函数,我目前无法有效地完成这项工作(即使我的树最多有 3 级深)。
解决方案
在熊猫中,您可以检查networkx
df=df.dropna()
import networkx as nx
G=nx.from_pandas_edgelist(df, 'parent', 'child',create_using=nx.DiGraph())
def find_root(G,node):
if len(list(G.predecessors(node)))>0:
root = find_root(G,list(G.predecessors(node))[0])
else:
root = node
return root
df['child'].apply(lambda x : find_root(G,x))
Out[109]:
1 A
2 A
3 A
推荐阅读
- c++ - 如何将python dict发送到C++
- reactjs - reactjs中同步调用函数
- python - 将我自己的函数导入 Azure 计时器触发器
- android - libav sws_scale() 在真实设备上的色彩空间转换失败,适用于模拟器
- apache-kafka - 当来自 kafka 的消息被读取为 Ktable 时,当它被读取为 Kstreams 并转换为 Ktable 时?
- intellij-idea - 忽略 Intellij/Pycharm 搜索的排除目录中的文件
- java - 使用 brew 启动 cassandra 时出错,显示以黄色开始
- iphone - 定位服务的应用程序权限弹出窗口从不显示在屏幕录制的视频中
- python - 在 Jupyter Notebook 中可视化决策树
- php - PHP Post 操作总是以状态 200 结束