10 эффективных советов панд

Python pandas

оригинальное название | 10 Python Pandas tricks that make your work more efficient

автор | Shiu-Tang Li

оригинальный | к data science.com/10-Python-afraid…

переводчик| kbsc13 (автор публичного аккаунта «The Growth of Algorithm Apes»)

утверждение| Перевод предназначен для общения и обучения, добро пожаловать на перепечатку, но, пожалуйста, сохраните эту статью для коммерческих или незаконных целей.

Управляемое чтение

Pandas — это библиотека Python, широко используемая в таких областях, как анализ данных. По нему есть много туториалов, но вот несколько менее популярных, но очень полезных советов.

read_csv

Это функция, которую должен знать каждый, потому что это способ чтения CSV-файла.

Но если вам нужно прочитать большой объем данных, вы можете добавить параметр --nrows=5, чтобы сначала загрузить небольшой объем данных, что позволяет избежать использования неправильного разделителя, поскольку не все разделяется запятыми, а затем загружает весь набор данных.

Ps. В терминале Linux вы можете использоватьheadкоманда для просмотра первых 5 строк данных в файле, пример команды выглядит следующим образом:

head -n 5 data.txt

После загрузки данных вы можете передать методdf.columns.tolist()Получите все имена столбцов, затем используйте параметрыusecols=['c1','c2',...]для чтения столбцов, которые действительно необходимы. Если вы хотите читать быстрее и знать тип данных некоторых столбцов, вы можете использовать параметрыdtype={'c1':str, 'c2':int,...}, еще одним преимуществом использования этого параметра является то, что для столбцов, содержащих разные типы, например столбцы, содержащие как строки, так и целые числа, этот параметр может указывать, что столбец является строковым или целочисленным типом, избегая использования этого столбца в качестве ключа. произошло при объединении разных таблиц.

Select_dtypes

Если вам нужно выполнить предварительную обработку данных в Python, этот метод может сэкономить вам время. После прочтения таблицы тип данных по умолчанию может бытьbool, int64, float64, object, category, timedelta64, datetime64, вы можете сначала использовать следующие методы, чтобы просмотреть дистрибутив и узнатьdataframeКакие типы данных входят в:

df.dtypes.value_counts()

Затем используйте следующие методы для выбора конкретных типов данных, таких как числовые функции:

df.select_dtypes(include=['float64', 'int64'])

copy

Этот метод очень важен, сначала посмотрите на следующий пример:

import pandas as pd
df1 = pd.DataFrame({ 'a':[0,0,0], 'b': [1,1,1]})
df2 = df1
df2['a'] = df2['a'] + 1
df1.head()

После запуска приведенного выше кода вы найдетеdf1Значение изменено, потому чтоdf2=df1Этот код неверенdf1сделать копию, а затем назначитьdf2, но устанавливает указатель наdf1указатель. так что любая параdf2изменения изменятсяdf1, если вы хотите изменить эту проблему, вы можете использовать следующий код:

df2 = df1.copy()

или

from copy import deepcopy
df2 = deepcopy(df1)

map

Это действительно крутая команда, которую можно использовать для выполнения простых операций преобразования данных. Сначала вам нужно определить словарь, ключи которого являются старыми значениями, а значения — новыми значениями, например:

level_map = {1: 'high', 2: 'medium', 3: 'low'}
df['c_level'] = df['c'].map(level_map)

И несколько примеров:

  • boolean True, False преобразуется в 1, 0
  • Иерархия определений
  • Пользовательская кодировка словаря

apply or not apply

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

def rule(x, y):
    if x == 'high' and y > 10:
         return 1
    else:
         return 0
df = pd.DataFrame({ 'c1':[ 'high' ,'high', 'low', 'low'], 'c2': [0, 23, 17, 4]})
df['new'] = df.apply(lambda x: rule(x['c1'], x['c2']), axis =  1)
df.head()

В приведенном выше коде мы сначала определяем метод с двумя входными параметрами, а затем используемapplyспособ применить его кdfдве колонкиc1, c2.

applyПроблема в том, что иногда скорость слишком низкая. Если вы хотите рассчитатьc1иc2Максимальное значение двух столбцов можно записать как:

df['maximum'] = df.apply(lambda x: max(x['c1'], x['c2']), axis = 1)

Но вы обнаружите, что это намного медленнее, чем следующий код:

df['maximum'] = df[['c1','c2']].max(axis=1)

суть: если вы можете взять на себя работу, которую выполняют другие встроенные функции, не беритесь за нее.applyметод. Например, если вы хотите выровнятьcЗначение округляется до целого значения, можно использовать методround(df['c'], o)илиdf['c'].round(o), Вместо того, чтобы использоватьapplyКод метода:df.apply(lambda x: round(x['c'], 0), axis=1)

value_counts

Этот метод используется для проверки распределения значений. Например, вы хотите узнатьcЧастота и возможное количество вхождений каждого уникального значения столбца может быть следующим:

df['c'].value_counts()

Вот еще несколько интересных приемов или параметров:

  1. normalize=True: Если вы хотите видеть частоту вместо количества раз, вы можете использовать эту настройку параметра;
  2. dropna=False: просмотр статистики с отсутствующими значениями
  3. df['c'].value_counts().reset_index(): Если вы хотите преобразовать эту статистику вdataframeи оперировать на нем
  4. df['c'].value_counts().reset_index().sort_values(by='index')илиdf['c'].value_counts().sort_index(): реализует сортировку таблицы статистики по каждому значению столбца

number of missing values

При построении модели мы хотим удалить строки со слишком большим количеством отсутствующих значений или строки со всеми отсутствующими значениями. Это может быть достигнуто с помощью.isnull()и.sum()для подсчета количества пропущенных значений для определенного столбца:

import pandas as pd
import numpy as np
df = pd.DataFrame({ 'id': [1,2,3], 'c1':[0,0,np.nan], 'c2': [np.nan,1,1]})
df = df[['id', 'c1', 'c2']]
df['num_nulls'] = df[['c1', 'c2']].isnull().sum(axis=1)
df.head()

select rows with specific IDs

В SQL эту операцию можно выполнить с помощьюSELECT * FROM … WHERE ID in (‘A001’, ‘C022’, …)чтобы получить записи для конкретных идентификаторов. В то время как в пандах это можно сделать следующим образом:

df_filter = df['ID'].isin(['A001','C022',...])
df[df_filter]

Percentile groups

Предположим, есть столбец со всеми числовыми типами, а затем вы хотите разделить эти значения на несколько групп, например, первые 5% — первая группа, 5-20% — вторая группа, 20%-50% — третья группа, и, наконец, 50% — четвертая группа. Это можно сделать с помощью.cutметод, но у этого есть еще один вариант:

import numpy as np
cut_points = [np.percentile(df['c'], i) for i in [50, 80, 95]]
df['group'] = 1
for i in range(3):
    df['group'] = df['group'] + (df['c'] < cut_points[i])
# or <= cut_points[i]

Этот метод очень быстрый.

to_csv

Последний метод является очень распространенным, за исключениемcsvдокумент. Здесь тоже есть две маленькие хитрости:

Первыйprint(df[:5].to_csv()), этот код печатает первые 5 строк, а также данные, которые будут сохранены в файле.

Еще одна хитрость заключается в работе со смешанными целыми и пропущенными значениями. Когда столбец имеет как пропущенные значения, так и целые числа, его тип данныхfloatвведите вместоintтип. Так что при экспорте таблицы можно добавить параметрыfloat_format='%.of'будущееfloatПреобразование типа в целое число. Если вы просто хотите получить целые числа, вы можете удалить.o


Добро пожаловать в мой общедоступный аккаунт WeChat--Рост алгоритма обезьяны, или отсканируйте QR-код ниже, чтобы общаться, учиться и развиваться вместе!

Рекомендуемое чтение: