2015-08-06 2 views
0

Вот несколько примеров моих данных, прежде чем я начну объяснять.Использование фрейма данных pandas для подбора данных для графика

PP04-O3N2SNpos log(O/H) + 12 positive error! negative error! nuclear metallicity NED calculated virgo infall distance in Kpc 
    9.04       0.24   -0.09    -     - 
    8.76       0.17   -0.02    -     4.61 
    8.92       0.04   -0.04    9.03    2.97297 
    9.22       0.04   -0.04    -     8.24493 
    8.78       0.44   -0.24    9.23    10.25775 
    8.96       0.07   -0.2    9.05    7.2698 
    8.78       0.03   -0.03    8.48    2.02958 

Так pp04 является Металличность на NED вычисленной расстоянии от центра и ядерной металличности является Металличность в центре. Я пытаюсь выяснить, есть ли какое-то уравнение, если бы я знал ядерную металличность и расстояние от центра, я мог бы выяснить PP04. Это будет выглядеть так:

'PP04' - 'nuclear metallicity' = distance * gradient 

где градиент - это то, что я ищу.

Для этого я написал код, чтобы соответствовать всем данным, поэтому ядерная металличность равна нулю, а затем я могу решить для градиента и нарисовать график, но у меня есть несколько проблем с моим кодом.

import matplotlib.pyplot as plt 
import pandas as pd 
from pandas import * 
from matplotlib import * 
import traceback 
import numpy as np 

#import data into a pandas dataframe called df 
df = pd.DataFrame.from_csv('Combined data.csv') 
df = df.dropna() 
#drop the nulls 
print df 
y = df['PP04-O3N2SNpos log(O/H)+12'] - df['nuclear metallicity'] 
yerr = np.array([(df['negative error!'],df['positive error!'])]).T 
x = df['NED calculated virgo infall distance in Kpc'] 
intercept, gradient = np.polyfit(x,y,1) 
print(intercept,gradient) 

#to make a graph using the data 
plt.errorbar(x,y,yerr,fmt = 'r-') 
plt.xlabel('Distance from center in kpc') 
plt.ylabel('PP04-O3N2SNpos log(O/H)+12') 
plt.title('Central metallicity vs SN metallicity') 
plt.show() 

Другая ошибка я получаю это один

TypeError: cannot concatenate 'str' and 'float' objects 

Я действительно новичок в Python, так что я уверен, что есть и другие вещи неправильно с моим кодом, и если вы можете помочь с этим тоже было бы оценили. Я не уверен, правильно ли я написал строчные данные, но я не могу проверить другие ошибки. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация и спасибо в продвинутом виде за помощью.

EDIT: Я использовал помощь ниже, чтобы изменить свой код, так что теперь его использование

pd.read_csv('Combined data.csv').dtypes 
pd.read_csv('Combined data.csv',na_values = '-').dtypes 
df = pd.read_csv('Combined data.csv',na_values = '-') 

Но теперь я получаю ошибку

TypeError: unsupported operand type(s) for -: 'float' and 'str' 

Вот это отслеживающий.

enter image description here

+0

1) Очевидно, что 'KeyError' не происходит, когда вы получите отслеживающий показано выше, так что это означает, что вы разобрали все, что вызвало Это. Возможно, было бы разумно удалить его из вопроса. 2) Ошибка, похоже, предполагает, что ваш массив 'x' содержит строки, а не floats. Проверьте тип в последнем столбце и при необходимости конвертируйте. –

+0

Мое предположение заключается в том, что дефисы, которые означают недостающие значения, могли бы помешать 'pandas' конвертировать столбец в float. Попробуйте использовать параметр 'na_values'' read_csv'. –

+0

Причина, по которой KeyError не происходит в трассировке, заключалась в том, что я удалил часть, назвавшую df ['ядерная металичность'], чтобы увидеть, были ли другие df тоже получены ошибки, но затем я получил вышеуказанную ошибку. Так что у меня все еще есть KeyError, но я думаю, я должен был сделать это более ясным. Спасибо за помощь, и я попробую то, что вы предложили. – Rima

ответ

0

Если у вас действительно есть дефис в вашем файле, то они, вероятно, предотвратить pandas признать столбцы как числа. Вы можете сказать ему, чтобы лечить дефис, как NaN подменяет, используя na_values параметр read_csv:

In [1]: import pandas as pd 

In [2]: %cat test.csv 
a,b 
0,- 
-,1 

In [3]: pd.read_csv('test.csv').dtypes 
Out[3]: 
a object 
b object 
dtype: object 

In [4]: pd.read_csv('test.csv', na_values='-').dtypes 
Out[4]: 
a float64 
b float64 
dtype: object 

In [5]: pd.read_csv('test.csv', na_values='-') 
Out[5]: 
    a b 
0 0 NaN 
1 NaN 1