<jupyter_start><jupyter_text>down voteacceptedYou can parallelize this with Dask.dataframe. This will work almost the same except that you can't use column assignment and will instead need to use the assign method```>>> dmaster = dd.from_pandas(master, npartitions=4)>>> dmaster = dmaster.assign(my_value=dmaster.original.apply(lambda x: helper(x, slave), name='my_value'))>>> dmaster.compute()```original  my_value0  this is a nice sentence         21      this is another one         32    stackoverflow is nice         1Additionally, you should think about the tradeoffs between using threads vs processes here. Your fuzzy string matching almost certainly doesn't release the GIL, so you won't get any benefit from using multiple threads. However, using processes will cause data to serialize and move around your machine, which might slow things down a bit.You can experiment between using threads and processes or a distributed system by managing the  get= keyword argument to the compute() method.```import dask.multiprocessingimport dask.threaded>>> dmaster.compute(get=dask.threaded.get)   this is default for dask.dataframe>>> dmaster.compute(get=dask.multiprocessing.get)   try processes instead```<jupyter_code>dmaster
%%time
import dask.dataframe as dd
import dask.multiprocessing
import dask.threaded
dmaster = dd.from_pandas(ref_df.head(120), npartitions=20)
dmaster = dmaster.assign(my_value=dmaster.inchi.apply(lambda x: enumerate_tautomers_smiles(Chem.MolToSmiles(Chem.MolFromInchi(str(x))))), name='my_value')
out_df = dmaster.compute(get=dask.threaded.get)


mols = []
fmt = '%(asctime)s - %(levelname)s - %(validation)s - %(message)s'
validator = Validator(log_format=fmt)

from molvs import Standardizer
s = Standardizer()

smols = []
for m in enumerate_tautomers_smiles('C[C@H]1CCC[C@@]2([C@@]1(CCCC2)O)C'):
    mol = Chem.MolFromSmiles(m)
    mols.append(mol)
    validator.validate(mol)
    smols.append(s.tautomer_parent(mol))


MolsToGridImage(mols, molsPerRow=4, subImgSize=(300, 200), legends=None, highlightAtomLists=None, useSVG=False)#, **kwargs)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10726150925486473, 'fraction_numerical': 0.010915994304698624, 'mean_word_length': 5.82200647249191, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 20, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '525633', 'license': 'BSD-3-Clause', 'n_tokens_mistral': 699, 'n_tokens_neox': 659, 'n_words': 191, 'path': 'docs/example_notebooks/utilities/Add tautomers to chemical table.ipynb', 'repo_name': 'YH-Cali/metatlas', 'size': '2107'}