Рубрики
Без рубрики

Фильтр/карта и манипулирование данными CSV, в Python

Когда я писал для этой статьи, я наткнулся на заявление следующим образом: Программирование – это искусство o … Tagged With Python, новички, учебник, информатика.

Когда я писал для этой статьи, я наткнулся на заявление следующим образом:

Программирование – это искусство решения проблем в нескольких строках кода.

Ну, когда я начал писать программы, часто я осознавал, что они излишне длинные. Одна из причин, по которой лень и не следовать хорошим методам кодирования, что является интересной темой для другого дня. Другая часть заключается в том, что такие функции, как карта и фильтр, не так интуитивно понятны, как типичные для петли при использовании для обработки списка или элементов словаря. Однако они невероятно короткие! Вот пример:

# example data
data = [ [0, ["bronze",] ] , [1,["gold","bronze"] ] , ... ]

# long version
filtered_data = []
for lst in data:
    if "gold" in lst[1]:
        filtered_data.append(lst)

# short version, checks if the word "gold" is in a particular list
filtered_data = list(filter(lambda x: "gold" in x[1], data))

# output
# [ [1,["gold","bronze"]] , ...]

Баланс между читаемостью и краткой должна наблюдаться, когда мы думаем о сокращении длины кода, который мы пишем. В приведенном выше примере обе версии являются достоверными решениями, и первая ближе к тому, как я воспринимаю решение. Тем не менее, изучение того, как использовать фильтр, а также функции Lambda невероятно мощный и может сэкономить вам много места.

Есть несколько мест, где мы можем легко применить фильтр/карту:

  • Когда мы имеем дело с списком/кортежом списков/словарей/кортежей, в основном коллекцией коллекций
  • Когда нам нужно переходить через каждый элемент в коллекции и определять, оставаться или отбрасывать ( filter )
  • Когда нам нужно перевернуть каждый элемент в коллекции и вносить прямые изменения в элемент ( map )

Вы должны помнить, чтобы применить преобразование типа, как правило, перечислять или кортежон в объект фильтра/карты, чтобы снова преобразовать их в коллекцию.

>>> l = [2,3,4]
>>> a = filter(lambda x:x==2,l)
>>> a

>>> list(a)
[2]

Предположим, что у вас есть файл CSV (разделенные запятыми) данных фильма в IMDB.CSV, где каждая запись содержит следующую информацию:

  1. Имя директора
  2. Жанр: он содержит список жанров, разделенных |
  3. Имя актера
  4. Название фильма
  5. IMDB Рейтинг
  6. Год выпуска

Вот так

director_name,genre,actor_name,movie_name,rating,year
Andrew Berends,Documentary|War,,The Blood of My Brother,3.5,2005
U. Roberto Romano,Documentary,,The Harvest/La Cosecha,4.6,2011
Amal Al-Agroobi,Documentary|Family,,The Brain That Sings,3.5,2013
Jem Cohen,Documentary,,Counting,3.1,2015

Теперь, если вы внимательно наблюдали, между запятыми есть пустые пространства, сигнализируя об отсутствии данных для определенных столбцов в приведенных выше данных образцах.

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

  • Удаление записей, которые не соответствуют спецификациям. В этом примере IMDB оценивает фильм по шкале 0-10 (включительно), мы не будем доверять каким-либо рейтингу, который находится вне этих границ.
  • Данные должны быть завершены. Ни одна из полей, то есть (i) режиссер, (ii) жанр, (iii) актер, (iv) фильм, (v) рейтинг и (iv) год выпуска должен быть пустым.
  • Данные состоит из фильмов, выпущенных между 1990 и 2019 годами. Если запись фильма выпущена за пределы этого периода времени, она считается ненадежным.

Давайте скажем, мы хотим очистить данные и вернуть список имен фильмов, которые имеют рейтинг выше или равны 9. Вот как мы подходим к вопросу и используем фильтр/карту по пути.

Это фрагмент функции вспомогательной обработки CSV в Python:

import csv
def read_csv(filename): 
    with open(filename, 'r') as f:
    # reads csv into a list of lists
        lines = csv.reader(f, delimiter=',') 
        return list(lines)[1:] # removes the header row # removes the header

Оба фильтр / карта Функция принимает два параметра, функция (может быть нормальной функцией или функцией Lambda) и коллекции (список/кортеж и т. Д.), На которой вы хотите поработать. Возвращает объект фильтра/карты. См. Комментарии для объяснения использования.

def clean_data(filename):
    # Process csv into python readable format
    data = read_csv(filename)

    # Check that none of the column is empty
    data = list(filter(lambda x: x[0]!="" and x[1]!="" and x[2]!="" and x[3]!="" and x[4]!="" and x[5]!="", data))
    # another way using a second filter
    # data = list(filter(lambda x: len(list(filter(lambda y:y!="",x)))==6,data))

    # Check that movie is within timespan
    data = list(filter(lambda x: 1990<= int(x[5])<=2019, data))

    # Check that movie rating is within range
    data = list(filter(lambda x: 0<=float(x[4])<=10, data))

    # Check that movie rating is higher than 9
    data = list(filter(lambda x: float(x[4])>=9, data))

    # Returns only a list of movie names
    return list(map(lambda x:x[3], data))
  • Обратите внимание, что данные из CSV имеют тип строки, и, следовательно, для сравнения числа требуется преобразование типа.
  • В применении нескольких функций фильтра и/или карты нет остановки, если они не смущают вас (как сейчас, так и будущее вас).

Вот и все. Надеемся, что этот простой пример показал вам, как использовать фильтр по умолчанию и функцию карты в Python. Счастливого обучения.

Оригинал: “https://dev.to/tlylt/filter-map-and-manipulating-csv-data-in-python-fnn”