Сходства и различия комбинаторных функций 5 Pandas

анализ данных
Сходства и различия комбинаторных функций 5 Pandas

1. Описание

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

concat

join merge combine append

Далее используется простейший пример для объяснения и различения роли нескольких функций.

>>> import pandas as pd

>>> df0 = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
>>> df0
   a  b
0  1  4
1  2  5
2  3  6

>>> df1 = pd.DataFrame({"c": [2, 3, 4], "d": [5, 6, 7]})
>>> df1
   c  d
0  2  5
1  3  6
2  4  7

2. concat

concat, написание "конкатенации",允许水平或垂直地并排Объединить данные.

2.1 Сращивание линий

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

когдаaxis=0Следует понимать, что сращивание выполняется в направлении столбцов (сращивание вниз), то есть сращивание рядами.

Имена столбцов должны быть согласованы, и вы получите желаемое соединение строк.df1.rename(columns={"c": "a", "d": "b"}).

>>> pd.concat([df0, df1.rename(columns={"c": "a", "d": "b"})]
                , axis=0)
 
   a  b
0  1  4
1  2  5
2  3  6
0  2  5
1  3  6
2  4  7

Если имена столбцов несовместимы, желаемый результат объединения строк не будет получен.

In [9]: pd.concat([df0,df1],axis=0)
Out[9]:
     a    b    c    d
0  1.0  4.0  NaN  NaN
1  2.0  5.0  NaN  NaN
2  3.0  6.0  NaN  NaN
0  NaN  NaN  2.0  5.0
1  NaN  NaN  3.0  6.0
2  NaN  NaN  4.0  7.0

резюме:

Объединение строк, если дополнительные столбцы не создаются, обратите внимание на то, чтобы имена столбцов были согласованными.

2.2 Сшивание столбцов

Нажмите на колонку,axis=1Его можно понимать как сращивание по направлению ряда (сращивание вправо), то есть сращивание столбиков между собой.

>>> pd.concat([df0, df1], axis=1)
   a  b  c  d
0  1  4  2  5
1  2  5  3  6
2  3  6  4  7

По умолчанию при объединении данных по горизонтали (т. е. вдоль столбцов) предпринимаются попытки индексирования. Когда они не идентичны, вы увидите NaN, заполненные непересекающимися данными, например:

>>> df2 = df1.copy()
>>> df2.index = [1, 2, 3]
>>> pd.concat([df0, df2], axis=1)
     a    b    c    d
0  1.0  4.0  NaN  NaN
1  2.0  5.0  2.0  5.0
2  3.0  6.0  3.0  6.0
3  NaN  NaN  4.0  7.0

Если вы хотите унифицировать индексы для объединения, вы должны сначала сбросить их индексы:

>>> pd.concat([df0.reset_index(drop=True), 
               df2.reset_index(drop=True)], axis=1)
   a  b  c  d
0  1  4  2  5
1  2  5  3  6
2  3  6  4  7

резюме:

Объединение столбцов, если не создаются дополнительные строки, обратите внимание на непротиворечивый индекс

3. join

В отличие от concat, соединение предназначено для使用索引连接DataFrame对象之间的列.

Индексы df0 и df1 согласованы:

>>> df0.join(df1)
   a  b  c  d
0  1  4  2  5
1  2  5  3  6
2  3  6  4  7

Когда индекс несовместим, соединение по умолчанию сохраняет строку из левого фрейма данных (левая таблица по умолчанию является ведущей таблицей); если в правом фрейме данных нет строки, которая соответствует индексу в левом фрейме данных, правый фрейм данных удаляется и заполняется Null, как показано ниже:

>>> df0.join(df2)
   a  b    c    d
0  1  4  NaN  NaN
1  2  5  2.0  5.0
2  3  6  3.0  6.0

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

# "right" uses df2’s index
>>> df0.join(df2, how="right")
     a    b  c  d
1  2.0  5.0  2  5
2  3.0  6.0  3  6
3  NaN  NaN  4  7# "outer" uses the union
>>> df0.join(df2, how="outer")
     a    b    c    d
0  1.0  4.0  NaN  NaN
1  2.0  5.0  2.0  5.0
2  3.0  6.0  3.0  6.0
3  NaN  NaN  4.0  7.0# "inner" uses the intersection
>>> df0.join(df2, how="inner")
   a  b  c  d
1  2  5  2  5
2  3  6  3  6

резюме:

Присоединение - это соединение на основе индекса, только соединение столбца, аналогичное соединению sql

4. merge

По сравнению с соединением слияние является более общим и может выполнять операции слияния для столбцов и индексов.

Внутренняя ассоциация в столбце a:

>>> df0.merge(df1.rename(columns={"c": "a"}), 
               on="a", how="inner")
   a  b  d
0  2  5  5
1  3  6  6

Если вы хотите сохранить связанные столбцы одновременно, вы можете написать:

>>> df0.merge(df1, left_on="a", right_on="c")
   a  b  c  d
0  2  5  2  5
1  3  6  3  6

Когда два объекта DataFrame имеют одинаковые столбцы, их нельзя объединять,suffixesПараметр задает суффикс для переименования этих столбцов, по умолчанию суффиксы левого и правого фреймов данных — «_x» и «_y» соответственно, которые также можно настроить.

>>> df0.merge(df1.rename(columns={"c": "a", "d": "b"}), 
               on="a", 
               how="outer", 
               suffixes=("_l", "_r"))

   a  b_l  b_r
0  1  4.0  NaN
1  2  5.0  5.0
2  3  6.0  6.0
3  4  NaN  7.0

5. combine

Функция объединения также действует на два объекта DataFrame, объединяя их по столбцам, но она сильно отличается от вышеперечисленных функций.

Функция объединения уникальна тем, что она принимает函数参数. Эта функция принимает две серии, по одной для каждого объединенного столбца в каждом кадре данных, и возвращает серию в качестве конечного значения поэлементной операции того же столбца.

Это немного сбивает с толку, давайте посмотрим на пример:

>>> def taking_larger_square(s1, s2):
...     return s1 * s1 if s1.sum() > s2.sum() else s2 * s2

>>> df0.combine(df1.rename(columns={"c": "a", "d": "b"}), 
                  taking_larger_square)
    a   b
0   4  25
1   9  36
2  16  49

Функция take_larger_square работает со столбцами a в df0 и df1 и столбцами b в df0 и df1. Между двумя столбцами a и двумя столбцами b функция take_larger_square берет квадрат значения в большем столбце. В этом случае столбцы a и b df1 будут возведены в квадрат, чтобы получить окончательное значение, которое состоит в том, что и a, и b df1 больше, чем a и b df0.Если один из df1 большой или другой маленький, все равно берется максимальное значение того, что квадрат.

In [13]: df0,df1
Out[13]:
(   a  b
 0  1  2
 1  2  3
 2  3  4,
    c  d
 0  4  1
 1  5  2
 2  6  3)

 In [11]: df0.combine(df1.rename(columns={"c": "a", "d": "b"}),
                      taking_larger_square)
Out[11]:
    a   b
0  16   4
1  25   9
2  36  16

резюме:

Объединение с помощью комбинирования в основном предназначено для выполнения обработки функций над рядом в двух объектах DataFrame и получения одного из них в качестве результата.

6. append

Функция добавления предназначена для将行追加到现有 DataFrame 对象, который создает новый объект.

>>> df0.append(df1.rename(columns={"c": "a", "d": "b"}))

   a  b
0  1  4
1  2  5
2  3  6
0  2  5
1  3  6
2  4  7

Это имеет тот же эффект, что и concat( , axis=0).

Что уникально в append, так это то, что он также может добавлять объекты dict, что дает нам гибкость для добавления различных типов данных. Обратите внимание, что для ignore_index должно быть установлено значение True, поскольку объект dict не имеет индексной информации, которую может использовать DataFrame.

>>> df0.append({"a": 1, "b": 2}, ignore_index=True)

   a  b
0  1  4
1  2  5
2  3  6
3  1  2

7. Резюме

  • concat: объединить данные по строке и столбцу

  • join: использовать индекс, объединять данные построчно

  • слияние: объединение данных по столбцам, больше похожее на операцию подключения к базе данных

  • объединение: объединение данных по столбцам с операциями элементов между столбцами (одним и тем же столбцом).

  • append: добавлять данные построчно как объект DataFrame или dict


Приглашаем обратить внимание на личный публичный номер:Distinct数说