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数说