2017-12-30 44 views
1

Pandas : populate column with if condition not working as expectedのテキストデータをデータフレームに読み込もうとしています。テキストデータをPythonのpandasデータフレームに読み込むことができません

dftxt = """ 
    0    1    2 
1 10/1/2016 'stringvalue'  456 
2 NaN   'anothersting' NaN 
3 NaN   'and another ' NaN 
4 11/1/2016 'more strings' 943 
5 NaN   'stringstring' NaN 
""" 

from io import StringIO 
df = pd.read_csv(StringIO(dftxt), sep='\s+') 
print (df) 

しかし、私は次のエラーを取得しています:私のコードがある

Traceback (most recent call last): 
    File "mydf.py", line 16, in <module> 
    df = pd.read_csv(StringIO(dftxt), sep='\s+') 
    File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 646, in parser_f 
    return _read(filepath_or_buffer, kwds) 
    File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 401, in _read 
    data = parser.read() 
    File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 939, in read 
    ret = self._engine.read(nrows) 
    File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 1508, in read 
    data = self._reader.read(nrows) 
    File "pandas/parser.pyx", line 848, in pandas.parser.TextReader.read (pandas/parser.c:10415) 
    File "pandas/parser.pyx", line 870, in pandas.parser.TextReader._read_low_memory (pandas/parser.c:10691) 
    File "pandas/parser.pyx", line 924, in pandas.parser.TextReader._read_rows (pandas/parser.c:11437) 
    File "pandas/parser.pyx", line 911, in pandas.parser.TextReader._tokenize_rows (pandas/parser.c:11308) 
    File "pandas/parser.pyx", line 2024, in pandas.parser.raise_parser_error (pandas/parser.c:27037) 
pandas.io.common.CParserError: Error tokenizing data. C error: Expected 4 fields in line 5, saw 6 

が、私は6つのフィールドが誤って読まされているかを理解することはできません:Expected 4 fields in line 5, saw 6。問題はどこでどのように解決できますか?問題は、あなたの区切りである

3 NaN   'and another ' NaN 
1 2    3 4  5  6 

-

答えて

1

5行目は、このいずれかになります。スペースで区切られた各単語を別々の列として解釈します。 'python'にあなたのエンジンが警告 また

df = pd.read_csv(StringIO(dftxt), sep='\s{2,}', engine='python') 

を抑制する

  • 変更あなたのsep引数\s{2,}に、そして
  • 変更

    にこのケースでは、私は、必要があると思いますstr.strip -

    012を使用して、引用符を取り除きます(余分です)。
    df.iloc[:, 1] = df.iloc[:, 1].str.strip("'") 
    df 
    
          0    1  2 
    1 10/1/2016 stringvalue 456.0 
    2  NaN anothersting NaN 
    3  NaN and another  NaN 
    4 11/1/2016 more strings 943.0 
    5  NaN stringstring NaN 
    

    最後には、別のパンダのユーザから、私はあなたが見てみるべきだと思いpd.read_clipboardと呼ばれる小さな便利な機能があります。クリップボードからデータを読み取り、read_csvが行うすべての引数を受け入れます。

+0

非常にうまく動作します。なぜ 'engine = 'python''が必要ですか?コードもこのオプションがなくてもうまくいくようです。 – rnso

+0

@rnso修正してください。デフォルトでは、Cエンジンはそれをサポートしていないと思われるので、 'python'エンジンは可変幅区切り文字に使用されます。それはまだ警告をスローします。明示的なものは暗黙的なものよりも優れています! (Zen of Pythonを覚えておいてください) –

関連する問題