Использование кадра данных 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
Спасибо за совет. Я использовал то, что вы предложили ниже, чтобы сделать дефисы заменой 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