Python Can';t将函数输出分配给列

Python Can';t将函数输出分配给列,python,pandas,Python,Pandas,我有一个名为locations的数据框,看起来像: Home Number Workplace Number Year A D 1998 B H 2001 C F 2012 D O 2005

我有一个名为locations的数据框,看起来像:

Home Number       Workplace Number      Year
A                 D                     1998
B                 H                     2001
C                 F                     2012
D                 O                     2005
我已经用“Home Number”创建了一个网络图。这里我想根据家庭网络计算家庭和工作场所之间的最小路径长度。对于给定的家庭和工作场所,我可以将它们插入以下功能:

def get_path_length(home_id, workplace_id):
    if home_id in nodes:
        try:
            path_length = nx.shortest_path(G, source = home_id, target = workplace_id)   
            print(path_length)
        except nx.NetworkXNoPath:
            path_length = -8888
    else:
        path_length = -9999
    return(path_length)
f = lambda x: get_path_length(x['Home Number'], x['Workplace Number'])
locations['Path Length'] = locations.apply(f, axis=1)
当我对数据帧中的每一行应用相同的函数,然后将结果存储在名为“Path Length”的列中时,问题就出现了。我尝试了以下方法:

location_data = locations[['Home Number','Workplace Number']]

locations['Path Length'] = location_data.apply(get_path_length,axis=1)
但我有一个错误:

TypeError: ("get_path_length() missing 1 required positional argument: 'Workplace Number'", 'occurred at index 0')
我还尝试迭代每一行:

for index, row in locations.iterrows():
    locations[index,'Path Length'] = get_judge_path(row['Home Number'],row['Workplace Number'])
但随后会出现错误:

ValueError: Length of values does not match length of index

有人知道如何解决这个问题吗?

您可以在lambda函数中传递两列:

def get_path_length(home_id, workplace_id):
    if home_id in nodes:
        try:
            path_length = nx.shortest_path(G, source = home_id, target = workplace_id)   
            print(path_length)
        except nx.NetworkXNoPath:
            path_length = -8888
    else:
        path_length = -9999
    return(path_length)
f = lambda x: get_path_length(x['Home Number'], x['Workplace Number'])
locations['Path Length'] = locations.apply(f, axis=1)

这很好用!非常感谢你的建议。是否有任何理由我必须对两列使用“lambda x”,但如果只有一列,直接应用函数就可以了?我使用了您的原始代码,它给出了我想要的内容。@Tian-这取决于您,指定了哪些列名称,您还可以传递10列。@Tian-btw,过滤是不必要的,工作良好
locations['Path Length']=locations.apply(f,axis=1)
这很有意义!没有过滤会使代码更干净。非常感谢你的帮助!