оригинальное название | 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()
Вот еще несколько интересных приемов или параметров:
- normalize=True: Если вы хотите видеть частоту вместо количества раз, вы можете использовать эту настройку параметра;
- dropna=False: просмотр статистики с отсутствующими значениями
-
df['c'].value_counts().reset_index()
: Если вы хотите преобразовать эту статистику вdataframe
и оперировать на нем -
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-код ниже, чтобы общаться, учиться и развиваться вместе!
Рекомендуемое чтение: