Команда merge может быть использована с опциями ключевого поля: left, right, inner, out, ... можно назначать разные ключевые поля в разных таблицах, назначать несколько колючевых полей в каждой таблице, использовать индексы в качестве ключей... Основные примеры взяты из книги "Python for data analysis"
Combining and Merging Data Sets from Python for data analysis¶
Data contained in pandas objects can be combined together in a number of built-in ways:
pandas.merge connects rows in DataFrames based on one or more keys. This will be familiar to users of SQL or other relational databases, as it implements database join operations.
pandas.concat glues or stacks together objects along an axis.
combine_first instance method enables splicing together overlapping data to fill in missing values in one object with values from another.
I will address each of these and give a number of examples. They’ll be utilized in examples throughout the rest of the book
left # DataFrame to be merged on the left side
right # DataFrame to be merged on the right side
how # One of 'inner', 'outer', 'left' or 'right'. 'inner' by default
on # Column names to join on. Must be found in both DataFrame objects. If not specified and no other join keys
# given, will use the intersection of the column names in left and right as the join keys
left_on # Columns in left DataFrame to use as join keys
right_on # Analogous to left_on for left DataFrame
left_index # Use row index in left as its join key (or keys, if a MultiIndex)
right_index # Analogous to left_index
sort # Sort merged data lexicographically by join keys; True by default. Disable to get better performance in some
# cases on large datasets
suffixes # Tuple of string values to append to column names in case of overlap; defaults to ('_x', '_y'). For
# example, if 'data' in both DataFrame objects, would appear as 'data_x' and 'data_y' in result
copy # If False, avoid copying data into resulting data structure in some exceptional cases. By default always copies
%matplotlib inline
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],
'data1': range(7)})
df2 = pd.DataFrame({'key': ['a', 'b', 'd'],
'data2': range(3)})
print(df1, df2)
This is an example of a many-to-one merge situation; the data in df1 has multiple rows labeled a and b, whereas df2 has only one row for each value in the key column. Calling merge with these objects we obtain:
pd.merge(df1, df2)
Это пример "много к одному" - в первой таблице есть нескоько строчек с одинаковыми ключами (по три штуки "a,b"), а во второй таблице только по одному значению. В итоговой таблице есть только строки с совпадающими значениями ключа (поэтому нет "c"), но зато есть все возможные сочетания. Чтобы убедится в этом, рассмотрим пример:
# Оставим без изменений
df1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],
'data1': range(7)})
df2 = pd.DataFrame({'key': ['a', 'b', 'b'],
'data2': range(3)})
Здесь мы проведем только одну замену в строке 'key': ['a', 'b', 'b'] мы заменили последнюю 'd' на 'b' и получим вариант "многие ко многим" (many-to-many) ...здесь понятие "все возможные сочетания" становится более очевидным.
pd.merge(df1, df2)
Note that I didn’t specify which column to join on. If not specified, merge uses the overlapping column names as the keys. It’s a good practice to specify explicitly, though:
# Explicity is better than implicity
pd.merge(df1, df2, on='key')
Если ключи в разных таблицах называются по разному, то их не надо переименовывать, можно их указать явно:¶
pd.merge(df3, df4, left_on='lkey', right_on='rkey')
Это было пересечение, но есть еще¶
You probably noticed that the 'c' and 'd' values and associated data are missing from the result. By default merge does an 'inner' join; the keys in the result are the intersection.
Other possible options are 'left', 'right', and 'outer'.
The outer join takes the union of the keys, combining the effect of applying both left and right joins:¶
pd.merge(df1, df2, how='outer')
Мы получили объединение таблиц, в котором есть ключ "c" (последняя строка), который присутствует только в одной таблице
df1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'b'], 'data1': range(6)})
df2 = pd.DataFrame({'key': ['a', 'b', 'a', 'b', 'd'], 'data1': range(5)})
pd.merge(df1, df2, on='key', how='left')
pd.merge(df1, df2, on='key', how='right')
Many-to-many joins form the Cartesian product of the rows. Since there were 3 'b' rows in the left DataFrame and 2 in the right one, there are 6 'b' rows in the result. The join method only affects the distinct key values appearing in the result:
pd.merge(df1, df2, how='inner')
left = pd.DataFrame({'key1': ['foo', 'foo', 'bar'],
'key2': ['one', 'two', 'one'],
'lval': [1, 2, 3]})
right = pd.DataFrame({'key1': ['foo', 'foo', 'bar', 'bar'],
'key2': ['one', 'one', 'one', 'two'],
'rval': [4, 5, 6, 7]})
pd.merge(left, right, on=['key1', 'key2'], how='outer')
A last issue to consider in merge operations is the treatment of overlapping column names. While you can address the overlap manually (see the later section on renaming axis labels), merge has a suffixes option for specifying strings to append to overlapping names in the left and right DataFrame objects:
pd.merge(left, right, on='key1')
pd.merge(left, right, on='key1', suffixes=('_left', '_right'))
Посты чуть ниже также могут вас заинтересовать
Здравствуйте! Постигаю азы Pandas. И возникла следующая задача: как объединить таблицы: 1 rows × 3023 columns и 4 columns × 3023 rows?
ОтветитьУдалитьПервая таблица (info):
MultiIndex: 3023 entries, (2017-01-03 00:00:00+00:00, Equity(45218 [NXTD])) to (2017-01-03 00:00:00+00:00, Equity(50554 [HEBT]))
Data columns (total 4 columns):
exchange_id 3023 non-null category
market_cap 3023 non-null float64
market_cap_yr_ago 2854 non-null float64
security_type 3023 non-null category
dtypes: category(2), float64(2)
memory usage: 77.1+ KB
Вторая таблица (info):
DatetimeIndex: 1 entries, 2017-01-03 to 2017-01-03
Columns: 3023 entries, Equity(45218 [NXTD]) to Equity(50554 [HEBT])
dtypes: float64(3023)
memory usage: 23.6 KB
"как объединить таблицы" - сначала без "пандасов" и форматов данных... вместо 3023 взять первые три (3) строки(столбца) и нарисовать, что есть (1х3 и 3х4 - две таблицы), а потом понять, для чего нужна итоговая таблица и решить, как она должна выглядеть (?х?).
УдалитьПосле этого будет ясно, что делать с данными - просто "прилепить сбоку", или делать сводную таблицу (с ключами-индексами).