Определенный способ для анализа буквенно-цифровых CSV в Python с scipy / numpy - PullRequest
3 голосов
/ 05 июня 2010

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

I 'Мне понравились стандартные возможности определения разделителей, определения наличия или отсутствия заголовка, количества пропускаемых строк, разделителя комментариев, игнорируемых столбцов и т. д. Основная функция, которую мне не хватает, - это возможность разбирать файлы CSV вспособ, который изящно обрабатывает как строковые данные, так и числовые данные.Многие из моих CSV-файлов имеют столбцы, которые содержат строки (не обязательно одинаковой длины) и числовые данные.Я хотел бы иметь возможность использовать массив массивов для этих числовых данных, а также иметь доступ к строкам.Например, предположим, что мой файл выглядит следующим образом (представьте, что столбцы разделены табуляцией):

# my file
name  favorite_integer  favorite_float1  favorite_float2  short_description
johnny  5  60.2  0.52  johnny likes fruitflies
bob 1  17.52  0.001  bob, bobby, robert

data = loadcsv('myfile.csv', delimiter='\t', parse_header=True, comment='#')

Я бы хотел иметь доступ к данным двумя способами:

  1. Как матрица значений: для меня важно получить массив numpy.array, чтобы я мог легко перемещать и получать доступ к столбцам, которые являются числовыми.В этом случае я хочу иметь возможность сделать что-то вроде:

    floats_and_ints = data.matrix

    floats_and_ints[:, 0] # access the integers

    floats_and_ints[:, 1:3] # access some of the floats transpose(floats_and_ints) # etc..

  2. Как объект, подобный словарю, где мне не нужно знать порядок заголовков: я бы хотел также получить доступ к данным по порядку заголовков.Например, я хотел бы сделать:

    data['favorite_float1'] # get all the values of the column with header "favorite_float1"

    data['name'] # get all the names of the rows

Я не хочу знать, чтоfavour_float1 - это второй столбец в таблице, поскольку это может измениться.

Для меня также важно иметь возможность перебирать строки и обращаться к полям по имени.Например:

for row in data:
  # print names and favorite integers of all 
  print "Name: ", row["name"], row["favorite_int"]

Представление в (1) предлагает numpy.array, но, насколько я могу судить, это плохо работает со строками и требует от меня указания типа данных заранееа также метки заголовков.

Представление в (2) предлагает список словарей, и это то, что я использовал.Тем не менее, это действительно плохо для файлов CSV, которые имеют два строковых поля, но остальные столбцы являются числовыми.Для числовых значений вы действительно хотите когда-нибудь получить доступ к матричному представлению и манипулировать им как numpy.array.

Существует ли комбинация функций csv / numpy / scipy, которая обеспечивает гибкостьобоих миров?Любой совет по этому поводу будет принята с благодарностью.

Таким образом, основные функции:

  1. Стандартная возможность указывать разделители, количество пропускаемых строк, игнорируемых столбцов и т. Д.
  2. Возможность получения numpy.array / матричного представления данных для обработки числовых значений.
  3. Возможность извлекать столбцы и строки по имени заголовка (как показано выше).пример)

Ответы [ 4 ]

4 голосов
/ 13 апреля 2012

Взгляните на панд , который построен поверх numpy. Вот небольшой пример:

In [7]: df = pd.read_csv('data.csv', sep='\t', index_col='name')
In [8]: df
Out[8]: 
        favorite_integer  favorite_float1  favorite_float2        short_description
name                                                                               
johnny                 5            60.20            0.520  johnny likes fruitflies
bob                    1            17.52            0.001       bob, bobby, robert
In [9]: df.describe()
Out[9]: 
       favorite_integer  favorite_float1  favorite_float2
count          2.000000         2.000000         2.000000
mean           3.000000        38.860000         0.260500
std            2.828427        30.179317         0.366988
min            1.000000        17.520000         0.001000
25%            2.000000        28.190000         0.130750
50%            3.000000        38.860000         0.260500
75%            4.000000        49.530000         0.390250
max            5.000000        60.200000         0.520000
In [13]: df.ix['johnny', 'favorite_integer']
Out[13]: 5
In [15]: df['favorite_float1'] # or attribute: df.favorite_float1
Out[15]: 
name
johnny    60.20
bob       17.52
Name: favorite_float1
In [16]: df['mean_favorite'] = df.mean(axis=1)
In [17]: df.ix[:, 3:]
Out[17]: 
              short_description  mean_favorite
name                                          
johnny  johnny likes fruitflies      21.906667
bob          bob, bobby, robert       6.173667
2 голосов
/ 12 апреля 2012

matplotlib.mlab.csv2rec возвращает numpy recarray, так что вы можете делать с этим все великие numpy вещи, которые вы делаете с любым массивом numpy , Отдельные строки, являющиеся экземплярами record, могут быть проиндексированы как кортежи, но также имеют атрибуты, автоматически именуемые для столбцов в ваших данных:

rows = matplotlib.mlab.csv2rec('data.csv')
row = rows[0]

print row[0]
print row.name
print row['name']

csv2rec также понимает "строки в кавычках", в отличие от numpy.genfromtext.

В общем, я считаю, что csv2rec сочетает в себе некоторые из лучших функций csv.reader и numpy.genfromtext.

0 голосов
/ 31 мая 2016

Почему бы просто не использовать stdlib csv.DictReader?

0 голосов
/ 10 декабря 2010

numpy.genfromtxt ()

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