2017-10-13 6 views
0

J'ai un dataframe, df, avec l'une des colonnes ::Conversion Pandas Strings Series Float

print(df['MJD_DUPLICATE']) 

0   (0, 56238, -1, -1, -1, -1, -1, -1, -1, -1, -1,... 
1   (-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1... 
2   (0, 56269, -1, -1, -1, -1, -1, -1, -1, -1, -1,... 

Autrement dit, comment puis-je convertir en un flotteur afin de tracer vers le haut?

b = df.astype(float) 

ne fonctionne pas ni fait:

for i in range(len(mjds)): 
    mjds[i] = [float(x) for x in mjds[i]] 

Merci !!

N.B.. ::

print(df['MJD_DUPLICATE'][0:][0:0]) 

(0, 56279, 0, 56539, 0, 56957, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1) 
Series([], Name: MJD_DUPLICATE, dtype: object) 
+0

Pourquoi avez-vous besoin de convertir en flotteurs pour tracer? – wwii

+0

Parce que sinon j'obtiens une erreur "ValueError: scatter nécessite une colonne numérique" – npross

+0

Les valeurs dans les tuples ne sont pas des * nombres *? – wwii

Répondre

0

Avez-vous essayé de créer une nouvelle colonne avec la trame de données qui est un flotteur puis comploter contre cela?

df['MJD_DUPLICATE_float'] = df['MJD_DUPLICATE'].astype(float) 
+0

Yup, essayé cela. Got :: ValueError: impossible de convertir la chaîne en float: '(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1, -1, -1, -1, -1, -1) ' – npross

+0

J'essayerais alors: df.convert_objects (convert_numeric = True). Vous pouvez vérifier les types que vous avez convertis en utilisant; df.convert_objects (convert_numeric = True) .dtypes – mpmartin618

+0

Non, cela ne fonctionne pas non plus. Voir la modification ci-dessus. – npross

0

Ecrire une fonction qui transforme les valeurs de ligne individuelle puis utilisez .apply()

data = {'a':[(' 1 ',' 2 ',' 3 '), ('2','3','4'), (3,4,5)], 
     'b':[('1','2','3'), ('2','3','4'), ('3','4','5')]} 

df = pd.DataFrame(data) 

def f(thing): 
    return tuple(float(n) for n in thing) 

converted = df['a'].apply(f) 
df['a'] = converted 



>>> converted 
0 (1.0, 2.0, 3.0) 
1 (2.0, 3.0, 4.0) 
2 (3.0, 4.0, 5.0) 
Name: a, dtype: object 
>>> df 
       a   b 
0 (1.0, 2.0, 3.0) (1, 2, 3) 
1 (2.0, 3.0, 4.0) (2, 3, 4) 
2 (3.0, 4.0, 5.0) (3, 4, 5) 
>>> 

Si vos données ressemble à ce

data = {'a':['''(1,2,3)''', '''(2,3,4)''', '''(3,4,5)'''], 
     'b':['''(1,2,3)''', '''(2,3,4)''', '''(3,4,5)''']} 

Changer votre fonction pour y faire face

def f(thing): 
     thing = thing.strip() 
     thing = thing.replace('(', '') 
     thing = thing.replace(')', '') 
     thing = thing.split(',') 
     return tuple(float(n) for n in thing) 
+0

Je reçois un :: "ValueError: impossible de convertir la chaîne en float: '(' error – npross

+0

J'ai changé chaque élément des tuples en chaînes, même en ajoutant des espaces, et cela fonctionne toujours Si vos données ont d'autres * problèmes *, vous devez déterminer ce qu'elles sont et les traiter dans la fonction que vous appliquez – wwii

+0

Bon, alors le code ci-dessus fonctionne et fonctionne, mais je ne peux toujours pas tracer quoi que ce soit ... – npross