如何解决如何基于熊猫的依赖值更新数据框?
我必须根据依赖项值更新数据帧。该怎么办?
例如,输入数据框df
:
id dependency
10
20 30
30 40
40
50 10
60 20
这里有:
20 -> 30
和30 -> 40
。因此最终结果将是20 -> 40
和30 -> 40
。
以同样的方式,60 -> 20 -> 30 -> 40
,所以最终结果将是60 -> 40
。
最终结果:
id dependency final_dependency
10
20 30 40
30 40 40
40
50 10 10
60 20 40
解决方法
您可以使用networkx
来执行此操作。首先,使用具有依赖关系的节点创建图:
df_edges = df.dropna(subset=['dependency'])
G = nx.from_pandas_edgelist(df_edges,create_using=nx.DiGraph,source='dependency',target='id')
现在,我们可以找到每个节点的根祖先并将其添加为新列:
def find_root(G,node):
ancestors = list(nx.ancestors(G,node))
if len(ancestors) > 0:
root = find_root(G,ancestors[0])
else:
root = node
return root
df['final_dependency'] = df['id'].apply(lambda x: find_root(G,x))
df['final_dependency'] = np.where(df['final_dependency'] == df['id'],np.nan,df['final_dependency'])
结果数据框:
id dependency final_dependency
0 10 NaN NaN
1 20 30.0 40.0
2 30 40.0 40.0
3 40 NaN NaN
4 50 10.0 10.0
5 60 20.0 40.0
,
一种方法是创建自定义函数:
s = df[df["dependency"].notnull()].set_index("id")["dependency"].to_dict()
def func(val):
if not s.get(val):
return None
while s.get(val):
val = s.get(val)
return val
df["final"] = df["id"].apply(func)
print (df)
id dependency final
0 10 NaN NaN
1 20 30.0 40.0
2 30 40.0 40.0
3 40 NaN NaN
4 50 10.0 10.0
5 60 20.0 40.0
,
您已经有了一些答案。 iterrows()是一个有点昂贵的解决方案,但也希望您也拥有它。
import pandas as pd
raw_data = {'id': [i for i in range (10,61,10)],'dep':[None,30,40,None,10,20]}
df = pd.DataFrame(raw_data)
df['final_dep'] = df.dep
for i,r in df.iterrows():
if pd.notnull(r.dep):
x = df.loc[df['id'] == r.dep,'dep'].values[0]
if pd.notnull(x):
df.iloc[i,df.columns.get_loc('final_dep')] = x
else:
df.iloc[i,df.columns.get_loc('final_dep')] = r.dep
print (df)
此输出将是:
id dep final_dep
0 10 NaN NaN
1 20 30.0 40
2 30 40.0 40
3 40 NaN NaN
4 50 10.0 10
5 60 20.0 30
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。