我有一个比较两个数据帧(数据和参考)的函数,以便在它们之间找到相似的行。
该函数的工作原理如下:
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"
等具有相同的行为。我在Mac OSX 13上运行python 3.6,并且pycharm和jupyter笔记本电脑都出现了问题。
我真的不知道它来自哪里,所以我希望周围的人可以帮我解决这个问题或给我一些建议!提前谢谢。
更新: