在 this post 上接受第二个答案,我尝试了以下代码
from multiprocessing import Pool
import numpy as np
from itertools import repeat
import pandas as pd
def doubler(number, r):
result = number * 2 + r
return result
def f1():
return np.random.randint(20)
if __name__ == '__main__':
df = pd.DataFrame({"A": [10,20,30,40,50,60], "B": [-1,-2,-3,-4,-5,-6]})
num_chunks = 3
# break df into 3 chunks
chunks_dict = {i:np.array_split(df, num_chunks)[i] for i in range(num_chunks)}
arg1 = f1()
with Pool() as pool:
results = pool.starmap(doubler, [zip(chunks_dict[i]['B'], repeat(arg1)) for i in range(num_chunks)])
print(results)
>>> [(-1, 20, -1, 20, -2, 20), (-3, 20, -3, 20, -4, 20), (-5, 20, -5, 20, -6, 20)]
这不是我想要的结果。我想要的是将
B
的 df
列的每个元素输入 doubler
函数,以及 f1
的输出 - 这就是我使用 starmap
和 repeat
的原因 - 得到输入的列表输出加倍并添加一些随机整数到它。例如,如果
f1
的输出是2,那么我想返回>>> [0,-2,-4,-6,-8,-10] # [2*(-1) + 2, 2*(-2) + 2, ... ]
谁能建议我如何达到这个预期的结果?谢谢
编辑:插入整个数据框也不起作用:
with Pool() as pool:
results = pool.starmap(doubler, [zip(df['B'], repeat(arg1))])
>>> TypeError: doubler() takes 2 positional arguments but 6 were given
本质上,我只想将我的数据帧分解成块,并将这些块以及其他变量 (arg1) 放入一个接受多个参数的函数中。
最佳答案
你的论点看起来不对。例如,在 print
中添加参数的 doubler
后,我看到以下内容(假设 f1()
返回 2
):
doubler number (-3, 2) r (-4, 2)
doubler number (-1, 2) r (-2, 2)
doubler number (-5, 2) r (-6, 2)
这是因为传递给
starmap
的参数是 zipped
,而不仅仅是 tuples
的列表。我认为重写分块程序和参数生成要容易得多。假设我理解正确,您希望为参数生成以下元组列表(假设
f1()
返回 2
):[(-1, 2), (-2, 2), (-3, 2), (-4, 2), (-5, 2), (-6, 2)]
然后这将应用于
doubler
函数,以便 starmap
返回这个 [doubler(-1, 2), doubler(-2, 2),...doubler(-6, 2)]
,即 [[0, -2, -4, -6, -8, -10]
。试试这个:from multiprocessing import Pool
import numpy as np
from itertools import repeat
import pandas as pd
def doubler(number, r):
result = number * 2 + r
return result
def f1():
return np.random.randint(20)
if __name__ == '__main__':
df = pd.DataFrame({"A": [10, 20, 30, 40, 50, 60], "B": [-1, -2, -3, -4, -5, -6]})
num_processes = 3
# the "r" value to use with every "B" value
random_r = f1()
# zip together a list of tuples of each B value and the random r value
tuples = [(b, r) for b, r in zip(df.B.values, repeat(random_r, len(df.B.values)))]
print(tuples)
with Pool(num_processes) as pool:
results = pool.starmap(doubler, tuples)
print(results)
关于python - 如何在 Pandas 数据帧上使用 pool.starmap()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47204452/