Ошибка «объект numpy.float64 не повторяется» для создания файла CSV в Python - PullRequest
0 голосов
/ 25 октября 2018

У меня есть очень шумные (астрономические) данные в формате csv.Его форма (815900,2) с 815k точками, дающими информацию о том, какова масса диска в определенный момент времени.Колебания довольно заметны, когда смотришь на них с близкого расстояния.Например, вот фрагмент данных, где первый столбец - это время в секундах, а второй - масса в килограммах:

40023700,2.40896E+028
40145700,2.44487E+028
40267700,2.44487E+028
40389700,2.44478E+028
40511600,1.535E+028
40633500,2.19067E+028
40755400,2.44496E+028
40877200,2.44489E+028
40999000,2.44489E+028
41120800,2.34767E+028
41242600,2.40936E+028

Таким образом, похоже, что уровень шума данных 1,53E + 028, а также, вероятно, 2,19E + 028 и 2,35E + 028 баллов.

Чтобы это исправить, я пытаюсь установить скрипт Python, который будет читать данные CSV, а затем наложить на него некоторое ограничение, чтобыесли масса, например, <2.35E + 028, она удалит всю строку, а затем создаст новый CSV-файл только с «хорошими» точками данных: </p>

40023700,2.40896E+028
40145700,2.44487E+028
40267700,2.44487E+028
40389700,2.44478E+028
40755400,2.44496E+028
40877200,2.44489E+028
40999000,2.44489E+028
41242600,2.40936E+028

После этого старого вопроса top answer от n8henrie, у меня пока есть:

import pandas as pd
import csv

# Here are the locations of my csv file of my original data and an EMPTY csv file that will contain my good, noiseless set of data

originaldata = '/Users/myname/anaconda2/originaldata.csv'
gooddata = '/Users/myname/anaconda2/gooddata.csv'

# I use pandas to read in the original data because then I can separate the columns of time as 'T' and mass as 'M'

originaldata = pd.read_csv('originaldata.csv',delimiter=',',header=None,names=['t','m'])

# Numerical values of the mass values

M = originaldata['m'].values

# Now to put a restriction in

for row in M:
    new_row = []
    for column in row:
        if column > 2.35E+028:
            new_row.append(column)

    csv.writer(open(newfile,'a')).writerow(new_row)

print('\n\n')
print('After:')
print(open(newfile).read())

Однако, когда я запускаю это, я получаю эту ошибку:

TypeError: 'numpy.float64' object is not iterable

Я знаю первый столбец (время)это dtype int64, а второй столбец (масса) - это dtype float64 ... но, как новичок, я все еще не совсем уверен, что означает эта ошибка или где я ошибаюсь.Любая помощь вообще будет оценена.Заранее большое спасибо.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Вы можете выбрать строки с помощью логической операции.Пример:

import pandas as pd
from io import StringIO

data = StringIO('''\
40023700,2.40896E+028
40145700,2.44487E+028
40267700,2.44487E+028
40389700,2.44478E+028
40511600,1.535E+028
40633500,2.19067E+028
40755400,2.44496E+028
40877200,2.44489E+028
40999000,2.44489E+028
41120800,2.34767E+028
41242600,2.40936E+028
''')

df = pd.read_csv(data,names=['t','m'])
good = df[df.m > 2.35e+28]
out = StringIO()
good.to_csv(out,index=False,header=False)
print(out.getvalue())

Вывод:

40023700,2.40896e+28
40145700,2.44487e+28
40267700,2.44487e+28
40389700,2.44478e+28
40755400,2.44496e+28
40877200,2.44489e+28
40999000,2.44489e+28
41242600,2.40936e+28
0 голосов
/ 25 октября 2018

Возвращает столбец: M = originaldata['m'].values

Поэтому, когда вы делаете for row in M:, вы получаете только одно значение в row, поэтому вы не можете повторить его снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...