使用多处理时返回奇怪输出的函数

2024-04-18 22:35:24 发布

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

我有一个比较两个数据帧(data和ref)的函数,以便在它们之间找到相似的行。你知道吗

函数的工作原理如下:

def get_ref(row, reference):

    match = np.isclose(row, reference.values, atol=5, equal_nan=True).all(axis=1)

    return reference[match].index[0] if match.any() else "unidentified"

我是这样用的:

match = pd.DataFrame({'name': _data.index, 'reference': np.apply_along_axis(get_ref, axis=1, arr=_data.values, reference=_ref)}, dtype=str)

输出为:

    name                                    reference
0   7e592b3b-74c1-4fe2-b2c8-2cd1cb814b86    unidentified
1   90471d88-3116-42b0-82bf-b4071a669ba9    Y74C9A.3
2   89cc6b73-743c-479a-a72b-f9163f47283b    Y74C9A.3
3   7eaee653-35da-45c5-a410-425c105c3084    unidentified
4   48744bdb-ca3b-4a13-a68d-00cd87cd61a4    unidentified
5   111bc3b7-edd8-41b9-9fb1-22bf7142765a    unidentified
6   c5a392cb-b8e0-407c-9456-ecfdf59f7a4d    unidentified
7   f417ad40-9674-4fdc-a16f-89d6afa7d2ff    unidentified
8   875bada8-9fde-4b7d-822f-85bf6d0ccc3f    unidentified
9   fd47e0dc-dfcc-4bfe-9363-083718fbd28d    unidentified
10  78e4ca7b-d588-48c5-b14e-d933d7eb86ea    unidentified
11  8283c91b-03da-4d76-a3bc-971524996148    unidentified
12  3aab659d-04bb-4591-a3f7-db6259d8a394    unidentified
13  b3265905-13b0-4d3c-9e42-e901ba46348e    Y74C9A.2a.5
14  339175fc-8390-42c7-9661-f75541bd5ef0    Y74C9A.2a.5

现在因为我需要加快速度,我决定使用multiprocessing。这就是我想到的代码:

def get_ref_mp(data, ref):

    df = data.groupby(['X'])
    type = df.groups.keys()

    workers = multiprocessing.cpu_count()
    pool = multiprocessing.Pool(processes=workers)

    args = [(df.get_group(i), ref.loc[ref['Y'].isin(i)]) for i in type]

    result = pool.starmap(_get_ref_apply, args)

    pool.close()
    pool.join()

    return pd.concat(result)


def _get_ref_apply(data, ref):

    _data = data.drop(['X'], axis=1)
    _ref = ref.drop(['Y'], axis=1)

    match = pd.DataFrame({'name': _data.index,
                          'reference': np.apply_along_axis(get_ref, axis=1, arr=_data.values, reference=_ref)}, dtype=str)

    return match

def get_ref(row, reference):

    match = np.isclose(row, reference.values, atol=5, equal_nan=True).all(axis=1)

    return reference[match].index[0] if match.any() else "unidentified"

问题是,现在我得到一些奇怪的输出,其中一些字符串被截断:

    name                                    reference
0   f23c7178-c02f-4f89-aef1-e291d8da2672    unidentified
0   aedaf687-a08e-4fce-bcca-1ec837d1c92b    AC3.12
1   745c50c1-a13a-4af9-b4fa-ac24f0ab8e39    uniden
0   3745591f-f1b7-4c54-8b18-8158b0fada7f    unidentified
1   7795891d-fc49-4984-b3bc-8c7a387a5091    unidentified
2   f1e3eb4d-75bc-4842-95be-2f216493ee64    unidentified
3   39ec6152-b659-49bd-84c5-b1a29b261e0a    unidentified
4   af396c92-a3c6-4641-8d22-e79194837c17    unidentified
0   016a643b-7a89-4341-b80a-1f8199a7c427    AH9.3
1   cef4ad50-0266-4f8b-aff1-03a47d3e61f4    unide
0   8991fa94-1f6e-4056-b57a-5fbc2b5c0c8e    unidentified
0   d30042f7-7e12-4232-8281-ebc51e617b69    unidentified
1   73f1c424-902d-42fc-b64b-dbe34350d334    B0001.2

从我看到的情况来看,截断似乎与进程相关(索引0表示这是一个新进程)。你知道吗

  • 首先我注意到,如果第一行返回"AC3.12"(6个字符长),那么下一行最多只返回6个字符,因此我得到的是"uniden",而不是"unidentified"。与"AH9.3"等行为相同

我在macosx13上运行python3.6,问题出现在pycharm和jupyter笔记本中。你知道吗

我真的不知道它是从哪里来的,所以我希望这里的人能帮我弄清楚或者给我一些建议!提前多谢了。你知道吗

更新:

-第二,当它返回“AC3.12”时,实际上应该返回“AC3.12.1”。或者用“AH9.3”代替“AH9.3.1”。即使第一行以长字符串开头,比如“unidentified”,它也只返回“B0001.2”,而不是“B0001.2.1”,所以我猜第二个点之后的所有内容都被截断了。。。

Tags: namerefdatagetindexreturndefmatch