Python的“TypeError:”Series“对象是可变的,因此它们不能被散列”,只有在用函数编写代码时才会引发

2024-03-29 13:19:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个函数,它需要使用多重处理来对存储在熊猫.DataFrame. 代码如下所示:

import pandas as pd
from multiprocessing import Pool

def foo(data_frame):
    #do stuff

def bar(data_frame, n)
    pool = Pool(n)
    result = pool.map(foo, data_frame)
    pool.close()
    pool.join()
    return result

data_frame = pd.DataFrame(<data>, columns=['a', 'b', 'c', 'd'])

#because Pool.map() requires a list of arguments as the 2nd argument:
df_aslist = [data_frame.iloc[i] for i in range(len(data_frame))]
bar(data_frame=df_aslist, n=5)

运行代码时,出现以下错误:

^{pr2}$

但如果我在函数外的bar()内编写代码,如下所示:

data_frame = pd.DataFrame(<data>, columns=['a', 'b', 'c', 'd'])
df_aslist = [data_frame.iloc[i] for i in range(len(data_frame))]
pool = Pool(n)
result = pool.map(foo, df_aslist)
pool.close()
pool.join()

代码运行时没有错误。我的问题是为什么?在函数栏()中编写时,如何解决这个问题?

提前谢谢!

编辑:我将提供更多细节,以便更好地理解我的示例。 我的程序的目的是获取一对经纬度坐标并计算它们之间的距离和持续时间。坐标对就是数据帧所包含的内容,因此看起来更像这样:

data_frame = pd.DataFrame({
    'loc1lon' : loc1lon_list,
    'loc1lat' : loc1lat_list,
    'loc2lon' : loc2lon_list,
    'loc2lat' : loc2lat_list
})

距离是用libOSRM计算的,后者是OSRM(开源路由机器)用来进行路由计算的后端库。它是一个C++库,所以我使用Booo::Python编写一个简单的模块,可以使用LybRrm(我命名为模块pySrM:P)。我在我的程序中这样使用它:

import PyOSRM
def foo(data):
    #foo is defined as a trick to allow multiprocessing to be used on boost::python funcitons. Would not work otherwise.
    return PyOSRM.calculate_loc_data(data)

Tags: 函数代码importdataframedfdatafoodef