web-dev-qa-db-ja.com

Pandas error ".strアクセサは文字列値でのみ使用できます"

次の入力ファイルがあります。

"Name",97.7,0A,0A,65M,0A,100M,5M,75M,100M,90M,90M,99M,90M,0#,0N#,

そして、私はそれを読んでいます:

#!/usr/bin/env python

import pandas as pd
import sys
import numpy as np

filename = sys.argv[1]
df = pd.read_csv(filename,header=None)
for col in df.columns[2:]:
    df[col] = df[col].str.extract(r'(\d+\.*\d*)').astype(np.float)

print df

ただし、エラーが発生します

    df[col] = df[col].str.extract(r'(\d+\.*\d*)').astype(np.float)
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/generic.py", line 2241, in __getattr__
    return object.__getattribute__(self, name)
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/base.py", line 188, in __get__
    return self.construct_accessor(instance)
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/base.py", line 528, in _make_str_accessor
    raise AttributeError("Can only use .str accessor with string "
AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas

これはpandas 0.14では問題なく動作しましたが、pandas 0.17.0では動作しません。

15
eleanora

最後の列が空であるために発生しているので、これはNaNに変換されます。

In [417]:
t="""'Name',97.7,0A,0A,65M,0A,100M,5M,75M,100M,90M,90M,99M,90M,0#,0N#,"""
df = pd.read_csv(io.StringIO(t), header=None)
df

Out[417]:
       0     1   2   3    4   5     6   7    8     9    10   11   12   13  14  \
0  'Name'  97.7  0A  0A  65M  0A  100M  5M  75M  100M  90M  90M  99M  90M  0#   

    15  16  
0  0N# NaN  

範囲を最後の行までスライスすると、動作します:

In [421]:
for col in df.columns[2:-1]:
    df[col] = df[col].str.extract(r'(\d+\.*\d*)').astype(np.float)
df

Out[421]:
       0     1   2   3   4   5    6   7   8    9   10  11  12  13  14  15  16
0  'Name'  97.7   0   0  65   0  100   5  75  100  90  90  99  90   0   0 NaN

または、object dtypeである列を選択してコードを実行することもできます(これは 'Name'エントリであるため、最初の列をスキップします)。

In [428]:
for col in df.select_dtypes([np.object]).columns[1:]:
    df[col] = df[col].str.extract(r'(\d+\.*\d*)').astype(np.float)
df

Out[428]:
       0     1   2   3   4   5    6   7   8    9   10  11  12  13  14  15  16
0  'Name'  97.7   0   0  65   0  100   5  75  100  90  90  99  90   0   0 NaN
13
EdChum

この場合、そのシリーズでstr.replace()メソッドを使用する必要がありますが、最初にstrタイプに変換する必要があります。

df1.Patient = 's125','s45',s588','s244','s125','s123'
df1 = pd.read_csv("C:\\Users\\Gangwar\\Desktop\\competitions\\cancer prediction\\kaggle_to_students.csv")
df1.Patient = df1.Patient.astype(str)
df1['Patient'] = df1['Patient'].str.replace('s','').astype(int) 
0

Eclipseでの作業中にこのエラーが発生しました。プロジェクトインタープリターは何らかの方法で(更新後)Python 2.7にリセットされました。Python 3.6に戻すと、この問題は解決されました。その結果、いくつかのクラッシュ、再起動、警告が発生しました。

私はこれがここで提起された問題の解決策ではないことを知っていますが、このエラーを検索した後にこのページに来たので、他の人にとっては役に立つかもしれないと思いました。

0
SPRBRN