Използване на рамка с данни на 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, така че съм сигурен, че има и други неща, които не са наред с кода ми и ако можете да помогнете и с това, ще бъда оценен. Не съм сигурен дали начинът, по който написах изобразяването на данните, е правилен, но не мога да проверя с другите грешки. Моля, уведомете ме, ако имате нужда от повече информация и благодаря предварително за помощта.

РЕДАКТИРАНЕ: Използвах помощта по-долу, за да променя кода си, така че сега го използвам

 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' 

Ето обратното проследяване.

въведете описание на изображението тук


person Rima    schedule 06.08.2015    source източник
comment
1) Очевидно KeyError не се случва, когато получите обратното проследяване, показано по-горе, така че това означава, че сте сортирали каквото и да го е причинило. Може би ще има смисъл да го премахнете от въпроса. 2) Грешката изглежда предполага, че вашият x масив съдържа низове, а не плаващи числа. Проверете типа в последната колона и конвертирайте, ако е необходимо.   -  person Lev Levitsky    schedule 07.08.2015
comment
Предполагам, че тиретата, които означават липсващите стойности, може да са попречили на pandas да преобразува колоната в плаващи. Опитайте да използвате параметъра na_values на read_csv.   -  person Lev Levitsky    schedule 07.08.2015
comment
Причината, поради която KeyError не се случва в проследяването, беше, че изтрих частта, която казваше df['nuclear metallicity'], за да видя дали другите df също получават грешки, но след това получих горната грешка. Така че все още имам KeyError, но предполагам, че трябваше да го направя по-ясно. Благодаря за помощта и ще опитам това, което ми предложихте.   -  person Rima    schedule 07.08.2015
comment
Във всеки случай е по-добре да питате за един програмен проблем на въпрос. Можете да опитате да отпечатате df.columns, за да видите дали има празно пространство в имената на колоните или нещо подобно.   -  person Lev Levitsky    schedule 07.08.2015
comment
Благодаря за съвета. Използвах това, което предложихте по-долу, за да направя hypens като NaN заместители, но все още получавам грешка, която според мен е свързана. Редактирах отговора си по-горе, за да отразя моите промени.   -  person Rima    schedule 07.08.2015
comment
1) Не е необходимо да четете файла три пъти... Направих го в интерактивна сесия, за да демонстрирам ефекта от na_values. Няма смисъл да се прави в сценарий. 2) Отпечатайте df.dtypes и вижте какво става. Ядрената металичност (вероятно) все още не е плаваща. Опитайте да го отпечатате, за да намерите причината, може би там има други na_values.   -  person Lev Levitsky    schedule 07.08.2015


Отговори (1)


Ако наистина имате тирета във вашия файл, те вероятно пречат на 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
person Lev Levitsky    schedule 07.08.2015