web-dev-qa-db-ja.com

pandas read_csvより柔軟なホワイトスペースでセパレータを作成するには?

ファイルに保存されたデータを使用してデータフレームを作成する必要があります。そのために、read_csvメソッドを使用します。ただし、セパレータはあまり規則的ではありません。一部の列はタブ(\t)で区切られ、他の列はスペースで区切られます。さらに、一部の列は、2つまたは3つ以上のスペース、またはスペースとタブの組み合わせ(たとえば、3つのスペース、2つのタブ、1つのスペース)で区切ることができます。

これらのファイルを適切に処理するためにpandasを伝える方法はありますか?

ところで、Pythonを使用している場合、この問題は発生しません。私が使う:

for line in file(file_name):
   fld = line.split()

そして、それは完璧に機能します。フィールド間に2つまたは3つのスペースがあってもかまいません。スペースとタブの組み合わせでも問題はありません。 pandas同じことをできますか?

48
Roman

documentation から、正規表現またはdelim_whitespace

>>> import pandas as pd
>>> for line in open("whitespace.csv"):
...     print repr(line)
...     
'a\t  b\tc 1 2\n'
'd\t  e\tf 3 4\n'
>>> pd.read_csv("whitespace.csv", header=None, delimiter=r"\s+")
   0  1  2  3  4
0  a  b  c  1  2
1  d  e  f  3  4
>>> pd.read_csv("whitespace.csv", header=None, delim_whitespace=True)
   0  1  2  3  4
0  a  b  c  1  2
1  d  e  f  3  4
88
DSM
>>> pd.read_csv("whitespace.csv", header = None, sep = "\s+|\t+|\s+\t+|\t+\s+")

任意の数のスペースとタブの任意の組み合わせを区切り文字として使用します。

8
Peaceful

Pandasには2つのcsvリーダーがありますが、冗長な先頭の空白に関してのみ柔軟性があります。

pd.read_csv("whitespace.csv", skipinitialspace=True)

一方ではない

pd.DataFrame.from_csv("whitespace.csv")

末尾の空白に関しては、どちらもすぐに使用できる柔軟性はありません。正規表現による回答を参照してください。 delim_whitespaceは、区切り文字としてスペースのみ(、または\ tなし)も許可するため、避けてください。

0
Gerben

これは、すべての組み合わせとゼロ個以上のオカレンスを処理すると考えられます。

pd.read_csv("whitespace.csv", header = None, sep = "[ \t]*,[ \t]*")
0
yoonghm