文字列からPandas DataFrameを作成する


276

いくつかの機能をテストするためにDataFrame、文字列からを作成したいと思います。私のテストデータが次のようであるとしましょう:

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

そのデータをパンダに読み込む最も簡単な方法は何DataFrameですか?

回答:


497

これを行う簡単な方法は、StringIO.StringIO(python2)またはio.StringIO(python3)を使用して、それをpandas.read_csv関数に渡すことです。例えば:

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=";")

7
Python 2と3の両方と互換性のあるコードが必要な場合from pandas.compat import StringIOは、Pythonに付属するクラスと同じクラスであることに注意して、オプションでを使用することもできます。
Acumenus 2017

3
FYI- pd.read_table()は同等の関数で、わずかに優れた命名法ですdf = pd.read_table(TESTDATA, sep=";")
wkzhu

5
@AntonvBR使用できることに注意してくださいpandas.compat.StringIO。これにより、StringIO個別にインポートする必要がなくなります。ただし、pandas.pydata.org / pandas-docs / stable / api.html?highlight = compatにpandas.compatよると、パッケージは非公開と見なされるため、今のところ、答えはそのままにしておきます。
Emil H


でTESTDATAを作成する場合はdf.to_csv(TESTDATA)、次を使用しますTESTDATA.seek(0)
user3226167

18

分割方法

data = input_string
df = pd.DataFrame([x.split(';') for x in data.split('\n')])
print(df)

2
:あなたが最初の行が列名を使用する場合は、これに第2ラインを変更df = pd.DataFrame([x.split(';') for x in data.split('\n')[1:]], columns=[x for x in data.split('\n')[0].split(';')])
マビン

1
CSVファイルでは改行(\ n)文字がフィールドの一部になる可能性があるため、これは誤りです。
Antonio Ercole De Luca

これはそれほど堅牢ではなく、ほとんどの人は受け入れられた答えでより良いでしょう。thomasburette.com/blog/2014/05/25/…に
DanB

10

インタラクティブな作業をすばやく簡単に行うには、クリップボードからデータを読み込んでテキストをコピーして貼り付ける方法があります。

マウスで文字列の内容を選択します。

Pandasデータフレームに貼り付けるデータをコピーする

Pythonシェルで使用 read_clipboard()

>>> pd.read_clipboard()
  col1;col2;col3
0       1;4.4;99
1      2;4.5;200
2       3;4.7;65
3      4;3.2;140

適切なセパレータを使用します。

>>> pd.read_clipboard(sep=';')
   col1  col2  col3
0     1   4.4    99
1     2   4.5   200
2     3   4.7    65
3     4   3.2   140

>>> df = pd.read_clipboard(sep=';') # save to dataframe

2
再現性は良くありませんが、それ以外はかなりきちんとしたソリューションです!
Mabyn

5

従来の可変幅CSVは、データを文字列変数として格納するために読み取ることができません。特に.pyファイル内で使用する場合は、代わりに固定幅のパイプ区切りデータを検討してください。さまざまなIDEとエディタには、パイプで区切られたテキストを適切なテーブルにフォーマットするプラグインが含まれている場合があります。

使用する read_csv

以下をユーティリティモジュールに保存しutil/pandas.pyます。例は、関数のdocstringに含まれています。

import io
import re

import pandas as pd


def read_psv(str_input: str, **kwargs) -> pd.DataFrame:
    """Read a Pandas object from a pipe-separated table contained within a string.

    Input example:
        | int_score | ext_score | eligible |
        |           | 701       | 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.

    `kwargs` are passed to `read_csv`. They must not include `sep`.

    In PyCharm, the "Pipe Table Formatter" plugin has a "Format" feature that can 
    be used to neatly format a table.

    Ref: https://stackoverflow.com/a/46471952/
    """

    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 pd.read_csv(io.StringIO(str_input), sep='|', **kwargs)

機能しない代替手段

以下のコードは、左側と右側の両方に空の列を追加するため、正しく機能しません。

df = pd.read_csv(io.StringIO(df_str), sep=r'\s*\|\s*', engine='python')

に関してはread_fwf、受け入れて使用するオプションのkwargsの多くは実際には使用しませんread_csv。そのため、パイプで区切られたデータには使用しないでください。


1
文書化されているよりもread_fwf多くのread_csvs引数をとる(試行錯誤による)ことがわかりましたが、一部は効果がないことは事実です。
ジェリット

-4

最も簡単な方法は、一時ファイルに保存してから読み取ることです。

import pandas as pd

CSV_FILE_NAME = 'temp_file.csv'  # Consider creating temp file, look URL below
with open(CSV_FILE_NAME, 'w') as outfile:
    outfile.write(TESTDATA)
df = pd.read_csv(CSV_FILE_NAME, sep=';')

一時ファイルを作成する正しい方法:Pythonで一時ファイルを作成するにはどうすればよいですか?


ファイルを作成する権限がない場合はどうなりますか?
BingLi224

私の意見では、それはもはや最も単純なケースではありません。「最も簡単」は質問で明示的に述べられていることに注意してください。
QtRoS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.