webentwicklung-frage-antwort-db.com.de

Pandas-Fehler "Kann nur .str-Accessor mit Zeichenfolgenwerten verwenden"

Ich habe folgende Eingabedatei:

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

Und ich lese es mit:

#!/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

Ich bekomme jedoch den Fehler

    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

Dies funktionierte in Pandas 0.14 in Ordnung, aber in Pandas 0.17.0 nicht.

13
eleanora

Dies geschieht, weil Ihre letzte Spalte leer ist und diese in NaN konvertiert wird:

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  

Wenn Sie Ihren Bereich bis zur letzten Reihe schneiden, funktioniert es:

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

Alternativ können Sie einfach die Spalten auswählen, die object dtype sind, und den Code ausführen (die erste Spalte überspringen, da dies der Eintrag 'Name' ist)

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
11
EdChum

In diesem Fall müssen wir die str.replace()-Methode für diese Serie verwenden, aber zuerst müssen wir sie in str type konvertieren:

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

Ich habe diesen Fehler bei der Arbeit in Eclipse erhalten. Es stellte sich heraus, dass der Projektinterpreter irgendwie (nach einem Update, glaube ich) auf Python 2.7 zurückgesetzt wurde. Durch das Zurücksetzen auf Python 3.6 wurde dieses Problem behoben. Dies führte zu mehreren Abstürzen, Neustarts und Warnungen. Nach einigen Minuten der Probleme scheint es jetzt behoben zu sein. 

Obwohl ich weiß, dass dies keine Lösung für das hier gestellte Problem ist, dachte ich, dass es für andere nützlich sein könnte, da ich auf diese Seite kam, nachdem ich nach diesem Fehler gesucht hatte. 

0
SPRBRN