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.
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
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
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')