Каковы аргументы "уровней", "ключей" и имен в функции concat Pandas?
вопросы
- как использовать
pd.concat? - что такое
1 ответ:
в процессе ответа на этот вопрос для себя я узнал много вещей, и я хотел собрать каталог примеров и пояснений.
конкретный ответ на вопрос как
pd.concatможет обрабатывать более двух объектов для слияния.в случае
d1иd2параметры выглядеть так:
outerpd.concat([d1, d2], axis=1, join='outer') A B C B C D 1 NaN NaN NaN 0.4 0.5 0.6 2 0.1 0.2 0.3 0.4 0.5 0.6 3 0.1 0.2 0.3 NaN NaN NaN
innerpd.concat([d1, d2], axis=1, join='inner') A B C B C D 2 0.1 0.2 0.3 0.4 0.5 0.6
join_axesчетвертый аргумент-это то, что позволяет нам делать наши
leftслияния и больше.join_axes: список объектов Index
Конкретные индексы, используемые для других осей n - 1 вместо выполнения внутренней/внешней логики набора.Левое Слияние
pd.concat([d1, d2, d3], axis=1, join_axes=[d1.index]) A B C B C D A B D 2 0.1 0.2 0.3 0.4 0.5 0.6 NaN NaN NaN 3 0.1 0.2 0.3 NaN NaN NaN 0.7 0.8 0.9Право Слияния
pd.concat([d1, d2, d3], axis=1, join_axes=[d3.index]) A B C B C D A B D 1 NaN NaN NaN 0.4 0.5 0.6 0.7 0.8 0.9 3 0.1 0.2 0.3 NaN NaN NaN 0.7 0.8 0.9
ignore_indexignore_index: boolean, по умолчанию False
Если True, не используйте значения Индекса вдоль оси сочленения. Полученная ось будет помечена как 0, ..., П - 1. Это полезно, если вы объединяете объекты, где ось объединения не имеет значимой информации индексирования. Обратите внимание, что значения индекса на других осях по-прежнему соблюдаются в соединении.например, когда я ставлю
d1наd2, если я не забочусь о значениях индекса, я мог бы сбросить их или игнорировать их.| pd.concat( | pd.concat( | [d1, d2], | [d1, d2] pd.concat([d1, d2]) | ignore_index=True) | ).reset_index(drop=True) --------------------- | ----------------------- | ------------------------- A B C D | A B C D | A B C D 2 0.1 0.2 0.3 NaN | 0 0.1 0.2 0.3 NaN | 0 0.1 0.2 0.3 NaN 3 0.1 0.2 0.3 NaN | 1 0.1 0.2 0.3 NaN | 1 0.1 0.2 0.3 NaN 1 NaN 0.4 0.5 0.6 | 2 NaN 0.4 0.5 0.6 | 2 NaN 0.4 0.5 0.6 2 NaN 0.4 0.5 0.6 | 3 NaN 0.4 0.5 0.6 | 3 NaN 0.4 0.5 0.6и при использовании
axis=1:| pd.concat( | [d1, d2], axis=1, pd.concat([d1, d2], axis=1) | ignore_index=True) ------------------------------- | ------------------------------- A B C B C D | 0 1 2 3 4 5 1 NaN NaN NaN 0.4 0.5 0.6 | 1 NaN NaN NaN 0.4 0.5 0.6 2 0.1 0.2 0.3 0.4 0.5 0.6 | 2 0.1 0.2 0.3 0.4 0.5 0.6 3 0.1 0.2 0.3 NaN NaN NaN | 3 0.1 0.2 0.3 NaN NaN NaN
keysмы можем передать список скалярных значений или кортежей, чтобы присвоить кортеж или скалярные значения соответствующим Мультииндексам. Длина передаваемого списка должна быть такой же, как и количество элементов, которые объединяются.
ключи: последовательность, по умолчанию none
Если несколько уровней пройдены, должны содержать кортежи. Построить иерархический индекс, используя переданные ключи как самый внешний уровень
axis=0сцепя
Seriesобъекты вдольaxis=0(расширение индекса).эти ключи, становятся новым начальным уровнем a
MultiIndexобъект в атрибуте индекса., мы можем использовать больше, чем скалярные значения в# length 3 length 3 # length 2 length 2 # /--------\ /-----------\ # /----\ /------\ pd.concat([s1, s2, s3], keys=['A', 'B', 'C']) pd.concat([s1, s2], keys=['A', 'B']) ---------------------------------------------- ------------------------------------- A 2 1 A 2 1 3 2 3 2 B 1 3 B 1 3 2 4 2 4 C 1 5 dtype: int64 3 6 dtype: int64keysаргумент для создания еще более глубокогоMultiIndex. Здесь мы проходимtuplesдлины 2 добавить два новых уровня aMultiIndex:pd.concat( [s1, s2, s3], keys=[('A', 'X'), ('A', 'Y'), ('B', 'X')]) ----------------------------------------------- A X 2 1 3 2 Y 1 3 2 4 B X 1 5 3 6 dtype: int64
axis=1это немного отличается при расширении вдоль столбцов. Когда мы использовали
Вариации из двухaxis=0(см. выше) нашиkeysвыступилаMultiIndexуровни в дополнение к существующему индексу. Ибоaxis=1, мы имеем в виду ось, котораяSeriesобъектов нет, а именно .Serieswtihaxis=1обратите внимание, что называя
s1иs2имеет значение, пока нетkeysare передано, но оно переопределяется, если есть.| | | pd.concat( | pd.concat( | pd.concat( | [s1.rename('U'), pd.concat( | [s1, s2], | [s1.rename('U'), | s2.rename('V')], [s1, s2], | axis=1, | s2.rename('V')], | axis=1, axis=1) | keys=['X', 'Y']) | axis=1) | keys=['X', 'Y']) -------------- | --------------------- | ---------------------- | ---------------------- 0 1 | X Y | U V | X Y 1 NaN 3.0 | 1 NaN 3.0 | 1 NaN 3.0 | 1 NaN 3.0 2 1.0 4.0 | 2 1.0 4.0 | 2 1.0 4.0 | 2 1.0 4.0 3 2.0 NaN | 3 2.0 NaN | 3 2.0 NaN | 3 2.0 NaNMultiIndexсSeriesиaxis=1Дваpd.concat( [s1, s2], axis=1, keys=[('W', 'X'), ('W', 'Y')]) ----------------------------------- W X Y 1 NaN 3.0 2 1.0 4.0 3 2.0 NaNDataFrameСaxis=1С
axis=0примерыkeysдобавить уровни кMultiIndex, но на этот раз к объекту, хранящемуся в .pd.concat( | pd.concat( [d1, d2], | [d1, d2], axis=1, | axis=1, keys=['X', 'Y']) | keys=[('First', 'X'), ('Second', 'X')]) ------------------------------- | -------------------------------------------- X Y | First Second A B C B C D | X X 1 NaN NaN NaN 0.4 0.5 0.6 | A B C B C D 2 0.1 0.2 0.3 0.4 0.5 0.6 | 1 NaN NaN NaN 0.4 0.5 0.6 3 0.1 0.2 0.3 NaN NaN NaN | 2 0.1 0.2 0.3 0.4 0.5 0.6 | 3 0.1 0.2 0.3 NaN NaN NaNSeriesиDataFrameСaxis=1это сложно. В этом случае скалярное значение ключа не может выступать в качестве единственного уровня индекса для на
Seriesобъект как источник имени столбца.Ограниченияpd.concat( | pd.concat( [s1, d1], | [s1.rename('Z'), d1], axis=1, | axis=1, keys=['X', 'Y']) | keys=['X', 'Y']) --------------------- | -------------------------- X Y | X Y 0 A B C | Z A B C 2 1 0.1 0.2 0.3 | 2 1 0.1 0.2 0.3 3 2 0.1 0.2 0.3 | 3 2 0.1 0.2 0.3keysиMultiIndexвывод.кажется, что панды только выводят имена столбцов из
Seriesимя, но оно не будет заполнять пробелы при выполнении аналогичной конкатенации среди фреймов данных с другим числом столбцов уровни.d1_ = pd.concat( [d1], axis=1, keys=['One']) d1_ One A B C 2 0.1 0.2 0.3 3 0.1 0.2 0.3затем объедините это с другим фреймом данных только с одним уровнем в объекте столбцов, и панды откажутся пытаться сделать кортежи
MultiIndexобъект и объединить все фреймы данных, как если бы один уровень объектов, скаляров и кортежей.pd.concat([d1_, d2], axis=1) (One, A) (One, B) (One, C) B C D 1 NaN NaN NaN 0.4 0.5 0.6 2 0.1 0.2 0.3 0.4 0.5 0.6 3 0.1 0.2 0.3 NaN NaN NaNпередает
dictвместоlistпри передаче словаря,
pandas.concatбудет использовать ключи из словаря, какkeysпараметр.# axis=0 | # axis=1 pd.concat( | pd.concat( {0: d1, 1: d2}) | {0: d1, 1: d2}, axis=1) ----------------------- | ------------------------------- A B C D | 0 1 0 2 0.1 0.2 0.3 NaN | A B C B C D 3 0.1 0.2 0.3 NaN | 1 NaN NaN NaN 0.4 0.5 0.6 1 1 NaN 0.4 0.5 0.6 | 2 0.1 0.2 0.3 0.4 0.5 0.6 2 NaN 0.4 0.5 0.6 | 3 0.1 0.2 0.3 NaN NaN NaN
levelsэто используется в сочетании с