web-dev-qa-db-fra.com

Erreur Pandas "Ne peut utiliser que l'accesseur .str avec les valeurs de chaîne"

J'ai le fichier d'entrée suivant:

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

Et je le lis avec:

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

Cependant, j'ai l'erreur

    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

Cela a bien fonctionné dans les pandas 0.14 mais ne fonctionne pas dans les pandas 0.17.0.

13
eleanora

Cela se produit parce que votre dernière colonne est vide, elle est donc convertie en 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  

Si vous coupez votre plage jusqu'à la dernière ligne, cela fonctionne:

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

Sinon, vous pouvez simplement sélectionner les colonnes qui sont object dtype et exécuter le code (en ignorant la première colonne car il s'agit de l'entrée 'Nom'):

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

Dans ce cas, nous devons utiliser la méthode str.replace() sur cette série, mais nous devons d’abord la convertir en type 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
Knowledge Elegance

J'ai eu cette erreur en travaillant dans Eclipse. Il s'est avéré que l'interprète de projet était en quelque sorte (après une mise à jour, je crois) réinitialisé sur Python 2.7. Le fait de revenir à Python 3.6 a résolu ce problème. Tout cela a entraîné plusieurs accidents, redémarrages et avertissements. Après plusieurs minutes de problèmes, cela semble réglé maintenant. 

Bien que je sache que ce n’est pas une solution au problème posé ici, j’ai pensé que cela pourrait être utile pour d’autres, car je suis arrivé sur cette page après avoir recherché cette erreur. 

0
SPRBRN