2017-10-15 3 views
1

I "MJD" vs. "MJD_DUPLICATE" mit dem (13MB) Dataset DR14Q_pruned_repeats.csv“hier plotten möchten :: https://www.dropbox.com/s/1dyong27bre3p9j/DR14Q_pruned_repeats.csv?dl=0Strings Konvertieren in Pandas Serie Floats

Hier ist mein 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() 

die MJD vs. MJD_DUPLICATE Plotten Linie gibt einen Fehler ::

ValueError: scatter requires y column to be numeric 

und die pd.to_numeric Linie zurück nur NaNs.

Antwort

0

Sie benötigen:

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() 

Convert Spalte MJD_DUPLICATE zu Tupeln von string s und dann durch die Positionsauswahlwert - z.B. str[1] für zweite Werte von Tupeln:

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

Dies funktioniert, aber nicht das, was ich will. Ich muss alle numerischen Daten in den MJD_DUPLICATES behalten, nicht nur eine zweite Spalte. – npross

+0

Ja, dann erstellen Sie eine neue Spalte mit dem neuen Namen 'multiples ['MJD_DUPLICATE_NEW'] = pd.to_numeric (ser, errors = 'coerce')' und plotten Sie es multiples.plot.scatter (x = 'MJD', y = ' MJD_DUPLICATE_NEW ') ' – jezrael

+0

Einfach kann nicht Tupel plotten, brauchen Skalare. – jezrael