Изучите эти полезные функции панд, чтобы ускорить обработку данных

Python

Если вы хотите получить информацию о 10 лучших учениках по общему баллу, вы можете отсортировать их по общему баллу, а затемhead(10)Давайте проделаем некоторые операции, но что, если количество студентов в топ-10 превышает 10 в той же рейтинговой ситуации?

Сегодня давайте взглянем на удобные методы функций, предоставляемые пандами, чтобы сделать нашу обработку данных на один шаг быстрее ~

содержание:

1. Найдите самые большие или самые маленькие верхние N групп данных.

Когда мы обрабатываем данные, мы часто сталкиваемся со сценарием, т.Найдите самые большие или самые маленькие верхние N групп данных в этой группе данных. Как правило, мы можем использоватьdf.sort_values(columns, ascending=False).head(n)получить, но часто есть некоторые данные параллельного ранжирования, которые будут безжалостно усечены и не могут быть получены. Итак, сегодня мы можем попробовать следующие методы, и все будет хорошо.

Давайте возьмем пример поиска первых N групп данных в качестве примера:

DataFrame.nlargest( n,columns,keep='first')

Series.nlargest( n=5,keep='first')

Необязательные значения для параметра keep: по умолчанию — первое, необязательное — последнее и все (буквально)

Сначала мы строим данные случая

>>> import pandas as pd
>>> df = pd.DataFrame({'population': [59000000, 65000000, 434000,
...                                   434000, 434000, 337000, 11300,
...                                   11300, 11300],
...                    'GDP': [1937894, 2583560 , 12011, 4520, 12128,
...                            17036, 182, 38, 311],
...                    'alpha-2': ["IT", "FR", "MT", "MV", "BN",
...                                "IS", "NR", "TV", "AI"]},
...                   index=["Italy", "France", "Malta",
...                          "Maldives", "Brunei", "Iceland",
...                          "Nauru", "Tuvalu", "Anguilla"])

>>> df
          population      GDP alpha-2
Italy       59000000  1937894      IT
France      65000000  2583560      FR
Malta         434000    12011      MT
Maldives      434000     4520      MV
Brunei        434000    12128      BN
Iceland       337000    17036      IS
Nauru          11300      182      NR
Tuvalu         11300       38      TV
Anguilla       11300      311      AI

Для приведенных выше данных случая, если мы хотим получить 3 верхних набора данных с наибольшим количеством полей населения, мы обнаружим, что третье место — 434000. При использованииhead(3), фактически 2 строки данных, удовлетворяющих требованиям, нами упущены, на этот раз используемdf.nlargest(3, 'population',keep='all'), чтобы получить нужный нам результат.

>>> df.head(3)
        population      GDP alpha-2
Italy     59000000  1937894      IT
France    65000000  2583560      FR
Malta       434000    12011      MT

>>> df.nlargest(3, 'population')
        population      GDP alpha-2
France    65000000  2583560      FR
Italy     59000000  1937894      IT
Malta       434000    12011      MT
# keep = 'all' 即表示满足排名的全部返回
>>> df.nlargest(3, 'population',keep='all')
          population      GDP alpha-2
France      65000000  2583560      FR
Italy       59000000  1937894      IT
Malta         434000    12011      MT
Maldives      434000     4520      MV
Brunei        434000    12128      BN

Конечно, мы можем столкнуться с более сложными требованиями, например, взять самые большие первые N групп данных по нескольким полям.В этом случае нам нужно взять три первых данных по ВВП с наибольшей численностью населения.

>>> df.nlargest(3, ['population', 'GDP'])
        population      GDP alpha-2
France    65000000  2583560      FR
Italy     59000000  1937894      IT
Brunei      434000    12128      BN

Для наименьших первых N групп данных функция выглядит следующим образом (параметры имеют тот же смысл):

DataFrame.nsmallest( n, columns,keep='first')

Series.nsmallest( n=5, keep='first')

2. Найдите процентное изменение между текущим элементом и предыдущим элементом

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

pct_change(periods=1,fill_method='pad', limit=None, freq=None, kwargs)

Первый взгляд наSeriesТип данных:

>>> s = pd.Series([90, 91, 85])
>>> s.pct_change()
0         NaN
1    0.011111
2   -0.065934
dtype: float64
# 设置间隔periods=2,在这里就是85相比90的变化率
>>> s.pct_change(periods=2)
0         NaN
1         NaN
2   -0.055556
dtype: float64

В случае пропущенных значений мы можем заполнить пропущенные значения и участвовать в расчете или установить параметры заполнения при расчете процентаfill_method:

>>> s = pd.Series([90, 91, None, 85])
>>> s
0    90.0
1    91.0
2     NaN
3    85.0
dtype: float64
    
>>> s.pct_change(fill_method='bfill')
0         NaN
1    0.011111
2   -0.065934
3    0.000000
dtype: float64
    
>>> s.pct_change(fill_method='ffill')
0         NaN
1    0.011111
2    0.000000
3   -0.065934
dtype: float64
    
>>> s.pct_change()
0         NaN
1    0.011111
2    0.000000
3   -0.065934
dtype: float64

можно и напрямуюDataframeВведите данные для обработки:

>>> df = pd.DataFrame({
...     'FR': [4.0405, 4.0963, 4.3149],
...     'GR': [1.7246, 1.7482, 1.8519],
...     'IT': [804.74, 810.01, 860.13]},
...     index=['1980-01-01', '1980-02-01', '1980-03-01'])
>>> df
                FR      GR      IT
1980-01-01  4.0405  1.7246  804.74
1980-02-01  4.0963  1.7482  810.01
1980-03-01  4.3149  1.8519  860.13

>>> df.pct_change()
                  FR        GR        IT
1980-01-01       NaN       NaN       NaN
1980-02-01  0.013810  0.013684  0.006549
1980-03-01  0.053365  0.059318  0.061876

>>> df = pd.DataFrame({
...     '2016': [1769950, 30586265],
...     '2015': [1500923, 40912316],
...     '2014': [1371819, 41403351]},
...     index=['GOOG', 'APPL'])
>>> df
          2016      2015      2014
GOOG   1769950   1500923   1371819
APPL  30586265  40912316  41403351
# 对行进行操作axis=1或'columns'
>>> df.pct_change(axis = 1)
      2016      2015      2014
GOOG   NaN -0.151997 -0.086016
APPL   NaN  0.337604  0.012002

>>> df.pct_change(axis = 'columns')
      2016      2015      2014
GOOG   NaN -0.151997 -0.086016
APPL   NaN  0.337604  0.012002

3. Преобразуйте каждый элемент в списке в строку

Иногда некоторые элементы в наших исходных данных могут быть в виде списков, и нам нужно их расширить, поэтомуexplodeВот метод.

Series.explode( ignore_index=False)

DataFrame.explode( column, ignore_index=False)

Посмотрите сначалаSeriesОбработка данных типа:

>>> s = pd.Series([[1, 2, 3], 'foo', [], [3, 4]])
>>> s
0    [1, 2, 3]
1          foo
2           []
3       [3, 4]
dtype: object
# 默认情况下,会复制索引
>>> s.explode()
0      1
0      2
0      3
1    foo
2    NaN
3      3
3      4
dtype: object
# 设置参数ignore_index=True,则会重置索引
>>> s.explode(ignore_index=True)
0      1
1      2
2      3
3    foo
4    NaN
5      3
6      4
dtype: object

посмотри еще раз наDataframeОперации над данными типа:

>>> df = pd.DataFrame({'A': [[1, 2, 3], 'foo', [], [3, 4]], 'B': 1})
>>> df
           A  B
0  [1, 2, 3]  1
1        foo  1
2         []  1
3     [3, 4]  1
# 默认情况下,会复制索引
>>> df.explode('A')
     A  B
0    1  1
0    2  1
0    3  1
1  foo  1
2  NaN  1
3    3  1
3    4  1
# 设置参数ignore_index=True,则会重置索引
>>> df.explode('A',ignore_index=True)
     A  B
0    1  1
1    2  1
2    3  1
3  foo  1
4  NaN  1
5    3  1
6    4  1