gpt4 book ai didi

python - 对 Pandas 数据框上的函数进行多重处理

转载 作者:太空宇宙 更新时间:2023-11-04 04:52:13 26 4
gpt4 key购买 nike

我有一个 Pandas 数据框,其中包含多个由 2 个或更多行项目组成的“记录”。我正在尝试使用多处理对每条记录有效地执行 CPU 密集型计算。下面是一个简单的示例,其中包含一个仅向每条记录添加随机数的函数:

import pandas as pd
from random import randrange
from multiprocessing import Pool

#Trivial example function
def my_func(record):
df.loc[((df.Record == record), 'Result')] = randrange(0,100)
print (df)

d = {'Record': ['A', 'A', 'B', 'B'], 'Values': [100, 200, 50, 70]}
df = pd.DataFrame(d)
all_records = df['Record'].unique()

if __name__ == '__main__':
pool = Pool(processes=2)
pool.map(my_func,all_records)
df.to_csv('output.csv')

所需的输出是原始数据框,其中包含一个名为“结果”的新列,其中包含每个记录的随机数。例如:

    Record  Values  Result
0 A 100 63.0
1 A 200 63.0
2 B 50 22.0
3 B 70 22.0

实际结果是我的 CSV 输出没有更新结果列。我可以通过函数中的 print 语句告诉进程正在工作。根据我的研究,这些过程作用于 df 的副本并且没有被重新组合在一起。如何将每个过程的结果反射(reflect)在单个数据框中?

最佳答案

这可能对你有用:

import pandas as pd
from random import randrange
from multiprocessing import Pool

#Trivial example function
def my_func(record):
sub_df = df.loc[df['Record'] == record]
sub_df['Result'] = randrange(0,100)
# return results for the record as pd.Series
return sub_df['Result']

d = {'Record': ['A', 'A', 'B', 'B'], 'Values': [100, 200, 50, 70]}
df = pd.DataFrame(d)
all_records = df['Record'].unique()

if __name__ == '__main__':
pool = Pool(processes=2)
results = pool.map(my_func, all_records)
pool.close()
pool.join()

# concatenate results into a single pd.Series
results = pd.concat(results)

# join results with original df
joined_df = df.join(results)

print(joined_df)
# Record Values Result
# 0 A 100 90
# 1 A 200 90
# 2 B 50 62
# 3 B 70 62

关于python - 对 Pandas 数据框上的函数进行多重处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47957962/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com