So erstellen Sie einen Pandas DataFrame aus einer Zeichenfolge

Um einige functionen zu testen, möchte ich einen DataFrame aus einer Zeichenfolge erstellen. Sagen wir, meine Testdaten sehen so aus:

 TESTDATA="""col1;col2;col3 1;4.4;99 2;4.5;200 3;4.7;65 4;3.2;140 """ 

Was ist der einfachste Weg, um diese Daten in einen Pandas DataFrame zu lesen?

   

Ein einfacher Weg dies zu tun ist, StringIO zu verwenden und dieses an die function pandas.read_csv . Z.B:

 import sys if sys.version_info[0] < 3: from StringIO import StringIO else: from io import StringIO import pandas as pd TESTDATA = StringIO("""col1;col2;col3 1;4.4;99 2;4.5;200 3;4.7;65 4;3.2;140 """) df = pd.read_csv(TESTDATA, sep=";") 

Eine herkömmliche CSV mit variabler Breite kann nicht gelesen werden, um Daten als Zeichenfolgenvariable zu speichern. Berücksichtigen Sie stattdessen röhrengetrennte Daten mit fester Breite. Verschiedene IDEs und Editoren verfügen möglicherweise über ein Plug-in, um durch Pipe getrennte Texte in einer übersichtlichen Tabelle zu formatieren.

Das Folgende funktioniert für mich. Um es zu verwenden, speichern Sie es in einer Datei namens pandas_util.py und rufen Sie read_pipe_separated_str(str_input) . Ein Beispiel ist im Docstring der function enthalten.

 import io import re import pandas as pd def _prepare_pipe_separated_str(str_input): substitutions = [ ('^ *', ''), # Remove leading spaces (' *$', ''), # Remove trailing spaces (r' *\| *', '|'), # Remove spaces between columns ] if all(line.lstrip().startswith('|') and line.rstrip().endswith('|') for line in str_input.strip().split('\n')): substitutions.extend([ (r'^\|', ''), # Remove redundant leading delimiter (r'\|$', ''), # Remove redundant trailing delimiter ]) for pattern, replacement in substitutions: str_input = re.sub(pattern, replacement, str_input, flags=re.MULTILINE) return str_input def read_pipe_separated_str(str_input): """Read a Pandas object from a pipe-separated table contained within a string. Example: | int_score | ext_score | automation_eligible | | | | True | | 221.3 | 0 | False | | | 576 | True | | 300 | 600 | True | The leading and trailing pipes are optional, but if one is present, so must be the other. In PyCharm, the "Pipe Table Formatter" plugin has a "Format" feature that can be used to neatly format a table. """ str_input = _prepare_pipe_separated_str(str_input) return pd.read_csv(pd.compat.StringIO(str_input), sep='|')