Как отфильтровать файл CSV без Pandas? (Лучшая замена Pandas в Pythonista)

Я пытаюсь выполнить некоторый анализ данных на Pythonista 3 (приложение iOS для python), однако из-за библиотек панд C оно не компилируется на устройстве iOS.

Есть ли замена пандам? Будет ли numpy вариантом для данных типа string?

Набор данных, который у меня есть на данный момент, — это история сообщений между моими друзьями и мной.

Вся история в одном csv файле. В каждой строке есть столбцы «day_of_the_week», «date», «time_of_message», «author_of_message», «message_body».

Цель анализа — составить отчет о нашем чате за последний год.

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

В Pandas я знаю, как это сделать. Например:

df = read_csv("messages.csv")
number_of_messages_friend1 = len(df[df.author_of_message == 'friend1']

Как я могу отфильтровать CSV-файл без Pandas?


person zeh    schedule 20.11.2016    source источник
comment
Я не знаю точных ограничений для Pythonista, но numpy имеет аналогичные требования к pandas, поэтому вряд ли он будет работать, если pandas не работает. Добавление некоторых сведений о том, что вы хотите сделать, может помочь получить более подходящие результаты.   -  person Ophir Yoktan    schedule 20.11.2016
comment
То же самое я думал о numpy и Pandas. Но это то, что предлагает pythonista. Я думаю, что разработчик приложения скомпилировал numpy в python, чтобы включить этот пакет. Во всяком случае, я отредактировал вопрос, чтобы сделать мою проблему более ясной.   -  person zeh    schedule 20.11.2016
comment
Если numpy не работает, вы можете использовать стандартные библиотечные инструменты для чтения csv в списки «записей» (namedtuple может быть вашим другом здесь), но это повлечет за собой множество циклов for, когда вы хотите что-то запрашивать. Я не знаю, может ли легкая dbms, такая как sqlite, исправить это.   -  person Maarten Fabré    schedule 20.11.2016
comment
Если numpy работает, то table также должен работать, так как он основан на numpy. pypi.org/project/tabel   -  person Bastiaan    schedule 13.09.2018


Ответы (3)


Поскольку в Pythonista есть numpy, вам нужно будет взглянуть на recarrays, которые представляют собой подход numpy к этому типу проблем. В Pythonista для меня работало следующее:

import numpy as np
df=np.recfromcsv('messages.csv')
len(df[df.author_of_message==b'friend1'])

В зависимости от вашего формата данных tou может обнаружить, что recsfromcsv "просто работает", так как он пытается угадать типы данных, или вам может потребоваться немного настроить некоторые вещи. См. genfromtext для ряда опций, таких как явное указание типов данных или использование преобразователей для преобразования строковых дат в объекты даты и времени. recsfromcsv — это просто удобная оболочка вокруг genfromtext

https://docs.scipy.org/doc/numpy/user/basics.io.genfromtxt.html#

После переназначения многие простые операции индексации работают так же, как и в пандах. Обратите внимание, что вам может понадобиться выполнить сравнение строк, используя строки с префиксом b (байтовые объекты), если только вы не конвертируете в строки Unicode, как показано выше.

person JonB    schedule 20.11.2016

Используйте модуль csv из стандартной библиотеки для чтения сообщений. Вы можете сохранить его в списке collections.namedtuple для быстрого доступа.

import csv

messages = []
with open('messages.csv') as csvfile:
    reader = csv.DictReader(csvfile, fieldnames=('day_of_the_week', 'date', 'time_of_message', 'author_of_message', 'message_body'))
    for row in reader:
        messages.append(row)

Это дает вам все сообщения в виде списка словарей.

В качестве альтернативы вы можете использовать обычный считыватель csv в сочетании с collections.namedtuple, чтобы составить список именованных кортежей, к которым немного легче получить доступ.

import csv
from collections import namedtuple

Msg = namedtuple('Msg', ('day_of_the_week', 'date', 'time_of_message', 'author_of_message', 'message_body'))

messages = []
with open('messages.csv') as csvfile:
    msgreader = csv.reader(csvfile)
    for row in msgreader:
        messages.append(Msg(*row))
person Roland Smith    schedule 20.11.2016

У Pythonista появился конкурент на iOS. Приложение pyto предоставляет python 3.8 с pandas. https://apps.apple.com/us/app/pyto-python-3-8

person elwarren    schedule 05.01.2020