2017-02-11 9 views
1

Я пытаюсь добавить заголовки столбцов к следующему набору данных. В соответствии со спецификациями проекта я не могу просто изменить файл, чтобы добавить эти заголовки вручную.Pandas преобразует все данные в NaN после добавления значений столбцов

Образец данных, которые я работаю с:

38.049133 0.224026 0.05398 -19.11 -20.03 
38.352526 0.212491 0.05378 -18.35 -19.19 
38.363598 0.210654 0.05401 -20.11 -20.89 
54.936819 0.216794 0.20114 -20.94 -21.88 
54.534881 0.578615 0.12887 -19.75 -20.66 
54.743075 0.508774 0.18331 -20.54 -21.53 
54.867240 0.562636 0.13956 -19.95 -20.85 
54.856908 0.544031 0.13938 -20.14 -21.03 
54.977748 0.501912 0.13923 -20.27 -21.01 
54.992762 0.460376 0.12723 -20.24 -20.83 

Я создал массив из 5 строк, чтобы действовать в качестве заголовков каждого из столбцов в пределах этого DataFrame. Используя назначенный заголовок, выбирает только этот столбец (т. Е. print(df['z']) выполняет печать только одного столбца (предположительно), но все данные в DataFrame, которые отображаются просто отлично (т. Е. Точно показывают вышеприведенные строки и правильно определяют столбцы), когда я не задавать столбцы, вдруг становится «NaN», когда я указать заголовки столбцов из массива строк

Пример моего кода:.

... imports and whatnot not shown 

dataColumns = ['RA', 'DEC', 'z', 'M(g)', 'M(r)'] 
dataFile = pd.read_csv(data = 'file_name', delim_whitespace = True) 
df = pd.DataFrame(data = dataFile, columns = dataColumns) 

print(df) 

Пример вывода кода выше (предполагается отображать точно данные образцов выше, но с добавленными заголовками колонн):

RA DEC z M(g) M(r) 
NaN NaN NaN NaN NaN 
NaN NaN NaN NaN NaN 
NaN NaN NaN NaN NaN 
NaN NaN NaN NaN NaN 
NaN NaN NaN NaN NaN 
NaN NaN NaN NaN NaN 
NaN NaN NaN NaN NaN 
NaN NaN NaN NaN NaN 
NaN NaN NaN NaN NaN 
NaN NaN NaN NaN NaN 

Почему это так, что без указания параметра «столбцы» для DataFrame данные будут правильно распечатываться после указания параметра, все отображается как NaN?

Любая помощь будет оценена!

- paanvaannd

ответ

1

Чтобы устранить проблему, используйте эту строку вместо:

df = pd.read_csv('file_name', header=None, names=dataColumns) 

pd.read_csv возвращает DataFrame, поэтому выше линия должна обрабатывать полноту импорта (т.е. вызова pd.DataFrame по результату pd.read_csv является излишним). header=None указывает, что панды не должны интерпретировать первую строку CSV в качестве заголовков, а затем names=... позволяет указать имена столбцов, которые вы хотели бы использовать. delim_whitespace не следует использовать, поскольку запятые, а не пробелы, являются разделителями в ваших данных («запятая» - это «c» в «csv», в конце концов). Фактически, без проверки ваших данных, я бы сказал, что использование delim_whitespace является наиболее вероятным виновником значений NaN.

+0

Спасибо за помощь! Сейчас он работает: +) – paanvaannd

+0

Добро пожаловать! Пожалуйста, примите этот ответ, если это тот, который вы использовали :) – cmaher

+0

Принято: +) Что касается моего вопроса для @James, поставленного в комментарии к их ответу: есть ли какая-то причина для выбора 'df.columns' для указания имен' 'параметр? – paanvaannd

0

Вы передаете dataframe, который вы создали, когда вы использовали .read_csv к dataframe конструктор pd.DataFrame. Я на самом деле удивлен, что он не ошибся.

Попробуйте это:

df = pd.read_csv(data = 'file_name', delim_whitespace = True) 
df.columns = dataColumns 
+1

Спасибо за помощь! В этом есть смысл. Одна из поправок к вашему предлагаемому коду: 'read_csv' не принимает параметр 'data', это просто' df = pd.read_csv ('file_name', delim_whitespace = True) '. Я также использую более сжатую версию @ cmaher для указания «имен» вместо добавления столбцов в отдельной строке. Это просто стилистика и дает тот же результат, не так ли? Есть ли причина, по которой можно было бы разделить команду, указав ее при вызове функции? – paanvaannd

Смежные вопросы