web-dev-qa-db-fra.com

Conversion de type en python AttributeError: l'objet 'str' n'a pas d'attribut 'astype'

Je suis confus par la conversion de type dans les pandas en python

df = pd.DataFrame({'a':['1.23', '0.123']})
type(df['a'])
df['a'].astype(float)

Ici df est une série de pandas et son contenu est constitué de 2 chaînes, alors je peux appliquer astype(float) sur cette série de pandas et convertir correctement toute chaîne en float. toutefois

df['a'][1].astype(float)

me donne AttributeError: l'objet 'str' n'a pas d'attribut 'astype'. Ma question est: comment cela peut-il être? Je pourrais convertir toute la série de chaîne en float, mais je ne pourrais pas convertir l'entrée de cette série de chaîne en float?

Aussi, je charge mon ensemble de données brutes 

df['id'].astype(int)

il génère ValueError: littéral non valide pour int () avec base 10: '' Celui-ci semble indiquer qu'il y a un blanc dans mon df['id']. Alors je vérifie si c'est vrai en tapant

'' in df['id']

ça dit faux. Donc je suis très confus.

3
ftxx

df['a'] renvoie un objet Series doté de astype en tant que méthode vectorisée pour convertir tous les éléments de la série en un autre.

df['a'][1] renvoie le contenu d'une cellule du dataframe, dans ce cas la chaîne '0.123'. Cela renvoie maintenant un objet str qui n'a pas cette fonction. Pour le convertir, utilisez l'instruction Python régulière:

type(df['a'][1])
Out[25]: str

float(df['a'][1])
Out[26]: 0.123

type(float(df['a'][1]))
Out[27]: float

Selon votre deuxième question, l'opérateur in situé à la fin appelant __contains__ par rapport à la série avec '' en tant qu'argument, voici la docstring de l'opérateur:

help(pd.Series.__contains__)
Help on function __contains__ in module pandas.core.generic:

__contains__(self, key)
    True if the key is in the info axis

Cela signifie que l'opérateur in recherche votre chaîne vide dans l'index, pas son contenu.

Pour rechercher vos chaînes vides, utilisez l'opérateur égal:

df
Out[54]: 
    a
0  42
1    

'' in df
Out[55]: False

df==''
Out[56]: 
       a
0  False
1   True

df[df['a']=='']
Out[57]: 
  a
1  
5
Boud

df['a'][1] renverra la valeur réelle dans le tableau, à la position 1, qui est en fait une chaîne. Vous pouvez le convertir en utilisant float(df['a'][1]).

>>> df = pd.DataFrame({'a':['1.23', '0.123']})
>>> type(df['a'])
<class 'pandas.core.series.Series'>
>>> df['a'].astype(float)
0    1.230
1    0.123
Name: a, dtype: float64
>>> type(df['a'][1])
<type 'str'>

Pour la deuxième question, vous avez peut-être une valeur vide sur vos données brutes. Le test correct serait:

>>> df = pd.DataFrame({'a':['1', '']})
>>> '' in df['a'].values
True

Source pour la deuxième question: https://stackoverflow.com/a/21320011/5335508

1
Ricardo Busquet
data1 = {'age': [1,1,2, np.nan],
        'gender': ['m', 'f', 'm', np.nan],
        'salary': [2,1,2, np.nan]}

x = pd.DataFrame(data1)
for i in list(x.columns):
    print(type((x[i].iloc[1])))
    if isinstance(x[i].iloc[1], str):
        print("It is String")
    else:
        print('Not a String')
0
kamran kausar