2017-10-15 5 views
1

je voudrais tracer « MJD » par rapport à « MJD_DUPLICATE » avec le (13Mo) jeu de données DR14Q_pruned_repeats.csv » trouvé ici :: https://www.dropbox.com/s/1dyong27bre3p9j/DR14Q_pruned_repeats.csv?dl=0conversion de chaînes de Flotteurs en Pandas série

Voici mon code:

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
from astropy.table import Table 
from astropy.io import ascii 
from astropy.io import fits 

filename = 'DR14Q_pruned_repeats.csv' 
df = pd.read_csv(filename) 

multiples = df[df["N_SPEC"] >2] 

multiples.plot.scatter(x='MJD', y='N_SPEC') 
plt.show() 

multiples.plot.scatter(x='MJD', y='MJD_DUPLICATE') 
plt.show() 

le MJD vs MJD_DUPLICATE ligne de traçage renvoie une erreur ::

ValueError: scatter requires y column to be numeric 

et retourne la ligne pd.to_numeric seulement NaNs.

Répondre

0

Vous devez:

import ast 

doubles = df[df["N_SPEC"] ==2].copy() 
multiples = df[df["N_SPEC"] >2].copy() 
repeats = df[df["N_SPEC"] >1].copy() 

multiples.plot.scatter(x='MJD', y='N_SPEC') 
plt.show() 

colonne Convertir MJD_DUPLICATE à tuples de string s puis sélectionner la valeur par la position - par exemple str[1] pour les secondes valeurs de tuples:

print (multiples['MJD_DUPLICATE'].head(10)) 
5  (0, 56279, 0, 56539, 0, 56957, -1, -1, -1, -1,... 
85  (0, 56243, 0, 56543, 0, 57328, -1, -1, -1, -1,... 
170 (0, 52262, 0, 55447, 0, 57011, -1, -1, -1, -1,... 
200 (0, 52262, 0, 55443, 0, 57006, -1, -1, -1, -1,... 
262 (0, 52525, 0, 55443, 0, 57011, -1, -1, -1, -1,... 
277 (0, 51793, 0, 55531, 0, 57006, -1, -1, -1, -1,... 
287 (0, 55182, 0, 55184, 0, 55443, -1, -1, -1, -1,... 
313 (0, 56248, 0, 56245, 0, 56572, -1, -1, -1, -1,... 
314 (0, 55182, 0, 55184, 0, 55444, -1, -1, -1, -1,... 
324 (0, 52261, 0, 55184, 0, 55444, -1, -1, -1, -1,... 
Name: MJD_DUPLICATE, dtype: object 

ser = multiples['MJD_DUPLICATE'].apply(ast.literal_eval).str[1] 
multiples['MJD_DUPLICATE'] = pd.to_numeric(ser, errors='coerce') 

print (multiples['MJD_DUPLICATE'].head(10)) 
5  56279 
85  56243 
170 52262 
200 52262 
262 52525 
277 51793 
287 55182 
313 56248 
314 55182 
324 52261 
Name: MJD_DUPLICATE, dtype: int64 

multiples.plot.scatter(x='MJD', y='MJD_DUPLICATE') 
plt.show() 
+0

Cela fonctionne, mais ne fait pas ce que je suis après. J'ai besoin de garder toutes les données numériques dans le MJD_DUPLICATES, pas seulement une deuxième colonne. – npross

+0

Oui, puis créez une nouvelle colonne avec le nouveau nom 'multiples ['MJD_DUPLICATE_NEW'] = pd.to_numeric (ser, errors = 'coerce')' et tracez-le 'multiples.plot.scatter (x = 'MJD', y = ' MJD_DUPLICATE_NEW ') ' – jezrael

+0

Vous ne pouvez pas tracer les tuples, vous avez besoin de scalaires. – jezrael