prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  [DOC] Clarify original-dataframe mutation behavior in pyjanitor function docstrings
  # Brief Description of Fix
  Currently, some pyjanitor functions mutate the original dataframe and others return a copy. Solutions are heavily discussed in #79 but no conclusion has been reached. At the moment, it is unclear, without experimentation from the user, which behavior applies in each function. 
  
  In the interim, I propose to explicitly clarify this behavior in each function's docstring so the user has a clear idea regarding the function's mutating behavior. Below is a sample of what this could look like for `.clean_names()`:
  
  """
  Clean column names.
      Takes all column names, converts them to lowercase, then replaces all
      spaces with underscores. <b>Does not mutate original dataframe.</b>
  """
  
  Happy to add this line somewhere else in the docstring if inappropriate here. 
  
  - [Link to documentation page](https://pyjanitor.readthedocs.io/reference/index.html)
  - [Link to exact file to be edited](https://github.com/ericmjl/pyjanitor/blob/dev/janitor/functions.py)
  
  
  </issue>
  <code>
  [start of janitor/biology.py]
  1 """
  2 Biology and bioinformatics-oriented data cleaning functions.
  3 """
  4 
  5 import pandas as pd
  6 import pandas_flavor as pf
  7 
  8 from .utils import deprecated_alias, import_message
  9 
  10 try:
  11     from Bio import SeqIO
  12 except ImportError:
  13     import_message(
  14         "biology", "biopython", "conda install -c conda-forge biopython"
  15     )
  16 
  17 
  18 @pf.register_dataframe_method
  19 @deprecated_alias(col_name="column_name")
  20 def join_fasta(
  21     df: pd.DataFrame, filename: str, id_col: str, column_name
  22 ) -> pd.DataFrame:
  23     """
  24     Convenience method to join in a FASTA file as a column.
  25 
  26     This allows us to add the string sequence of a FASTA file as a new column
  27     of data in the dataframe.
  28 
  29     This function only attaches the string representation of the SeqRecord.Seq
  30     object from Biopython. Does not attach the full SeqRecord. Alphabet is
  31     also not stored, under the assumption that the data scientist has domain
  32     knowledge of what kind of sequence is being read in (nucleotide vs. amino
  33     acid.)
  34 
  35     For more advanced functions, please use phylopandas.
  36 
  37     :param df: A pandas DataFrame.
  38     :param filename: Path to the FASTA file.
  39     :param id_col: The column in the DataFrame that houses sequence IDs.
  40     :param column_name: The name of the new column.
  41     """
  42     seqrecords = {
  43         x.id: x.seq.__str__() for x in SeqIO.parse(filename, "fasta")
  44     }
  45     seq_col = [seqrecords[i] for i in df[id_col]]
  46     df[column_name] = seq_col
  47     return df
  48
  [end of janitor/biology.py]
  </code>
  
  I need you to solve this issue by generating a single patch file that I can apply directly to this repository using git apply. Please respond with a single patch file in the following format.
  <patch>
  diff --git a/file.py b/file.py
  --- a/file.py
  +++ b/file.py
  @@ -1,27 +1,35 @@
   def euclidean(a, b):
  -    while b:
  -        a, b = b, a % b
  -    return a
  +    if b == 0:
  +        return a
  +    return euclidean(b, a % b)
   
   
   def bresenham(x0, y0, x1, y1):
       points = []
       dx = abs(x1 - x0)
       dy = abs(y1 - y0)
  -    sx = 1 if x0 < x1 else -1
  -    sy = 1 if y0 < y1 else -1
  -    err = dx - dy
  +    x, y = x0, y0
  +    sx = -1 if x0 > x1 else 1
  +    sy = -1 if y0 > y1 else 1
   
  -    while True:
  -        points.append((x0, y0))
  -        if x0 == x1 and y0 == y1:
  -            break
  -        e2 = 2 * err
  -        if e2 > -dy:
  -            err -= dy
  -            x0 += sx
  -        if e2 < dx:
  -            err += dx
  -            y0 += sy
  +    if dx > dy:
  +        err = dx / 2.0
  +        while x != x1:
  +            points.append((x, y))
  +            err -= dy
  +            if err < 0:
  +                y += sy
  +                err += dx
  +            x += sx
  +    else:
  +        err = dy / 2.0
  +        while y != y1:
  +            points.append((x, y))
  +            err -= dx
  +            if err < 0:
  +                x += sx
  +                err += dy
  +            y += sy
  +
  +    points.append((x, y))
       return points
  
  </patch>
golden_diff: diff --git a/janitor/biology.py b/janitor/biology.py
  --- a/janitor/biology.py
  +++ b/janitor/biology.py
  @@ -26,12 +26,14 @@
       This allows us to add the string sequence of a FASTA file as a new column
       of data in the dataframe.
   
  -    This function only attaches the string representation of the SeqRecord.Seq
  +    This method only attaches the string representation of the SeqRecord.Seq
       object from Biopython. Does not attach the full SeqRecord. Alphabet is
       also not stored, under the assumption that the data scientist has domain
       knowledge of what kind of sequence is being read in (nucleotide vs. amino
       acid.)
   
  +    This method mutates the original DataFrame.
  +
       For more advanced functions, please use phylopandas.
   
       :param df: A pandas DataFrame.
  
verification_info: {"golden_diff": "diff --git a/janitor/biology.py b/janitor/biology.py\n--- a/janitor/biology.py\n+++ b/janitor/biology.py\n@@ -26,12 +26,14 @@\n     This allows us to add the string sequence of a FASTA file as a new column\n     of data in the dataframe.\n \n-    This function only attaches the string representation of the SeqRecord.Seq\n+    This method only attaches the string representation of the SeqRecord.Seq\n     object from Biopython. Does not attach the full SeqRecord. Alphabet is\n     also not stored, under the assumption that the data scientist has domain\n     knowledge of what kind of sequence is being read in (nucleotide vs. amino\n     acid.)\n \n+    This method mutates the original DataFrame.\n+\n     For more advanced functions, please use phylopandas.\n \n     :param df: A pandas DataFrame.\n", "issue": "[DOC] Clarify original-dataframe mutation behavior in pyjanitor function docstrings\n# Brief Description of Fix\r\nCurrently, some pyjanitor functions mutate the original dataframe and others return a copy. Solutions are heavily discussed in #79 but no conclusion has been reached. At the moment, it is unclear, without experimentation from the user, which behavior applies in each function. \r\n\r\nIn the interim, I propose to explicitly clarify this behavior in each function's docstring so the user has a clear idea regarding the function's mutating behavior. Below is a sample of what this could look like for `.clean_names()`:\r\n\r\n\"\"\"\r\nClean column names.\r\n    Takes all column names, converts them to lowercase, then replaces all\r\n    spaces with underscores. <b>Does not mutate original dataframe.</b>\r\n\"\"\"\r\n\r\nHappy to add this line somewhere else in the docstring if inappropriate here. \r\n\r\n- [Link to documentation page](https://pyjanitor.readthedocs.io/reference/index.html)\r\n- [Link to exact file to be edited](https://github.com/ericmjl/pyjanitor/blob/dev/janitor/functions.py)\r\n\n", "before_files": [{"content": "\"\"\"\nBiology and bioinformatics-oriented data cleaning functions.\n\"\"\"\n\nimport pandas as pd\nimport pandas_flavor as pf\n\nfrom .utils import deprecated_alias, import_message\n\ntry:\n    from Bio import SeqIO\nexcept ImportError:\n    import_message(\n        \"biology\", \"biopython\", \"conda install -c conda-forge biopython\"\n    )\n\n\n@pf.register_dataframe_method\n@deprecated_alias(col_name=\"column_name\")\ndef join_fasta(\n    df: pd.DataFrame, filename: str, id_col: str, column_name\n) -> pd.DataFrame:\n    \"\"\"\n    Convenience method to join in a FASTA file as a column.\n\n    This allows us to add the string sequence of a FASTA file as a new column\n    of data in the dataframe.\n\n    This function only attaches the string representation of the SeqRecord.Seq\n    object from Biopython. Does not attach the full SeqRecord. Alphabet is\n    also not stored, under the assumption that the data scientist has domain\n    knowledge of what kind of sequence is being read in (nucleotide vs. amino\n    acid.)\n\n    For more advanced functions, please use phylopandas.\n\n    :param df: A pandas DataFrame.\n    :param filename: Path to the FASTA file.\n    :param id_col: The column in the DataFrame that houses sequence IDs.\n    :param column_name: The name of the new column.\n    \"\"\"\n    seqrecords = {\n        x.id: x.seq.__str__() for x in SeqIO.parse(filename, \"fasta\")\n    }\n    seq_col = [seqrecords[i] for i in df[id_col]]\n    df[column_name] = seq_col\n    return df\n", "path": "janitor/biology.py"}]}