{ "cells": [ { "cell_type": "markdown", "id": "2e977f26", "metadata": {}, "source": [ "# Kombinieren und Zusammenführen von Datensätzen\n", "\n", "Daten, die in pandas-Objekten enthalten sind, können auf verschiedene Weise kombiniert werden:\n", "\n", "* [pandas.merge](https://pandas.pydata.org/docs/reference/api/pandas.merge.html) führt Zeilen in DataFrames anhand eines oder mehrerer Schlüssel zusammen. Diese Funktion ist aus SQL oder anderen relationalen Datenbanken bekannt, da sie Datenbank-Join-Operationen implementiert.\n", "* [pandas.concat](https://pandas.pydata.org/docs/reference/api/pandas.concat.html) verkettet oder stapelt Objekte entlang einer Achse.\n", "* Die Instanzmethoden [pandas.DataFrame.combine_first](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.combine_first.html) oder [pandas.Series.combine_first](https://pandas.pydata.org/docs/reference/api/pandas.Series.combine_first.html) ermöglichen das Verknüpfen überlappender Daten.\n", "* [pandas.merge_asof](https://pandas.pydata.org/docs/reference/api/pandas.merge_asof.html) führt eine Verknüpfung nach Schlüsselabstand durch." ] }, { "cell_type": "markdown", "id": "8c707380", "metadata": {}, "source": [ "## Datenbankähnliche DataFrame-Verknüpfungen\n", "\n", "Merge- oder Join-Operationen kombinieren Datensätze, indem sie Zeilen anhand eines oder mehrerer Schlüssel verknüpfen. Diese Operationen sind besonders wichtig in relationalen, SQL-basierten Datenbanken. Die Merge-Funktion in pandas ist der zentrale Einstiegspunkt für die Anwendung dieser Algorithmen auf Ihre Daten." ] }, { "cell_type": "code", "execution_count": 1, "id": "0b80668e", "metadata": { "execution": { "iopub.execute_input": "2026-05-21T16:10:04.431566Z", "iopub.status.busy": "2026-05-21T16:10:04.431433Z", "iopub.status.idle": "2026-05-21T16:10:04.710912Z", "shell.execute_reply": "2026-05-21T16:10:04.710498Z", "shell.execute_reply.started": "2026-05-21T16:10:04.431550Z" } }, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 2, "id": "72210736-28ca-44a2-9c2b-8badfba2103d", "metadata": { "execution": { "iopub.execute_input": "2026-05-21T16:10:04.711560Z", "iopub.status.busy": "2026-05-21T16:10:04.711430Z", "iopub.status.idle": "2026-05-21T16:10:04.714552Z", "shell.execute_reply": "2026-05-21T16:10:04.714294Z", "shell.execute_reply.started": "2026-05-21T16:10:04.711552Z" } }, "outputs": [], "source": [ "encoding = pd.DataFrame(\n", " {\n", " \"Unicode\": [\n", " \"U+0000\",\n", " \"U+0001\",\n", " \"U+0002\",\n", " \"U+0003\",\n", " \"U+0004\",\n", " \"U+0005\",\n", " ],\n", " \"Decimal\": [0, 1, 2, 3, 4, 5],\n", " \"Octal\": [\"000\", \"001\", \"002\", \"003\", \"004\", \"005\"],\n", " \"Key\": [\"NUL\", \"Ctrl-A\", \"Ctrl-B\", \"Ctrl-C\", \"Ctrl-D\", \"Ctrl-E\"],\n", " },\n", ")\n", "\n", "update = pd.DataFrame(\n", " {\n", " \"Unicode\": [\n", " \"U+0003\",\n", " \"U+0004\",\n", " \"U+0005\",\n", " \"U+0006\",\n", " \"U+0007\",\n", " \"U+0008\",\n", " \"U+0009\",\n", " ],\n", " \"Decimal\": [3, 4, 5, 6, 7, 8, 9],\n", " \"Octal\": [\"003\", \"004\", \"005\", \"006\", \"007\", \"008\", \"009\"],\n", " \"Key\": [\n", " \"Ctrl-C\",\n", " \"Ctrl-D\",\n", " \"Ctrl-E\",\n", " \"Ctrl-F\",\n", " \"Ctrl-G\",\n", " \"Ctrl-H\",\n", " \"Ctrl-I\",\n", " ],\n", " },\n", ")" ] }, { "cell_type": "code", "execution_count": 3, "id": "37191511-b474-40d8-9a39-d785f678948c", "metadata": { "execution": { "iopub.execute_input": "2026-05-21T16:10:04.715062Z", "iopub.status.busy": "2026-05-21T16:10:04.714975Z", "iopub.status.idle": "2026-05-21T16:10:04.720544Z", "shell.execute_reply": "2026-05-21T16:10:04.720285Z", "shell.execute_reply.started": "2026-05-21T16:10:04.715055Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
UnicodeDecimalOctalKey
0U+00000000NUL
1U+00011001Ctrl-A
2U+00022002Ctrl-B
3U+00033003Ctrl-C
4U+00044004Ctrl-D
5U+00055005Ctrl-E
\n", "
" ], "text/plain": [ " Unicode Decimal Octal Key\n", "0 U+0000 0 000 NUL\n", "1 U+0001 1 001 Ctrl-A\n", "2 U+0002 2 002 Ctrl-B\n", "3 U+0003 3 003 Ctrl-C\n", "4 U+0004 4 004 Ctrl-D\n", "5 U+0005 5 005 Ctrl-E" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "encoding" ] }, { "cell_type": "code", "execution_count": 4, "id": "eb975aa7", "metadata": { "execution": { "iopub.execute_input": "2026-05-21T16:10:04.721103Z", "iopub.status.busy": "2026-05-21T16:10:04.721013Z", "iopub.status.idle": "2026-05-21T16:10:04.724515Z", "shell.execute_reply": "2026-05-21T16:10:04.724236Z", "shell.execute_reply.started": "2026-05-21T16:10:04.721095Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
UnicodeDecimalOctalKey
0U+00033003Ctrl-C
1U+00044004Ctrl-D
2U+00055005Ctrl-E
3U+00066006Ctrl-F
4U+00077007Ctrl-G
5U+00088008Ctrl-H
6U+00099009Ctrl-I
\n", "
" ], "text/plain": [ " Unicode Decimal Octal Key\n", "0 U+0003 3 003 Ctrl-C\n", "1 U+0004 4 004 Ctrl-D\n", "2 U+0005 5 005 Ctrl-E\n", "3 U+0006 6 006 Ctrl-F\n", "4 U+0007 7 007 Ctrl-G\n", "5 U+0008 8 008 Ctrl-H\n", "6 U+0009 9 009 Ctrl-I" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "update" ] }, { "cell_type": "markdown", "id": "ce2f4cab", "metadata": {}, "source": [ "Wenn wir `df.merge()` aufrufen, erhalten wir:" ] }, { "cell_type": "code", "execution_count": 5, "id": "3c3df196", "metadata": { "execution": { "iopub.execute_input": "2026-05-21T16:10:04.724964Z", "iopub.status.busy": "2026-05-21T16:10:04.724890Z", "iopub.status.idle": "2026-05-21T16:10:04.728987Z", "shell.execute_reply": "2026-05-21T16:10:04.728679Z", "shell.execute_reply.started": "2026-05-21T16:10:04.724957Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
UnicodeDecimalOctalKey
0U+00033003Ctrl-C
1U+00044004Ctrl-D
2U+00055005Ctrl-E
\n", "
" ], "text/plain": [ " Unicode Decimal Octal Key\n", "0 U+0003 3 003 Ctrl-C\n", "1 U+0004 4 004 Ctrl-D\n", "2 U+0005 5 005 Ctrl-E" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "encoding.merge(update)" ] }, { "cell_type": "markdown", "id": "cd0a1598", "metadata": {}, "source": [ "Standardmäßig führt `merge` einen sogenannten *Inner Join* durch; die Schlüssel im Ergebnis sind die Schnittmenge oder die gemeinsamen Elemente beider Tabellen." ] }, { "cell_type": "markdown", "id": "7e4b3cfe", "metadata": {}, "source": [ "
\n", "\n", "**Hinweis:**\n", "\n", "Ich habe nicht angegeben, über welcher Spalte die Zusammenführung erfolgen soll. Wenn diese Information nicht angegeben wird, verwendet `merge` die übereinstimmenden Spaltennamen als Schlüssel. Es empfiehlt sich jedoch, dies explizit anzugeben:\n", "
" ] }, { "cell_type": "code", "execution_count": 6, "id": "e3ac98a4", "metadata": { "execution": { "iopub.execute_input": "2026-05-21T16:10:04.730204Z", "iopub.status.busy": "2026-05-21T16:10:04.730111Z", "iopub.status.idle": "2026-05-21T16:10:04.733912Z", "shell.execute_reply": "2026-05-21T16:10:04.733622Z", "shell.execute_reply.started": "2026-05-21T16:10:04.730196Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
UnicodeDecimal_xOctal_xKey_xDecimal_yOctal_yKey_y
0U+00033003Ctrl-C3003Ctrl-C
1U+00044004Ctrl-D4004Ctrl-D
2U+00055005Ctrl-E5005Ctrl-E
\n", "
" ], "text/plain": [ " Unicode Decimal_x Octal_x Key_x Decimal_y Octal_y Key_y\n", "0 U+0003 3 003 Ctrl-C 3 003 Ctrl-C\n", "1 U+0004 4 004 Ctrl-D 4 004 Ctrl-D\n", "2 U+0005 5 005 Ctrl-E 5 005 Ctrl-E" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "encoding.merge(update, on=\"Unicode\")" ] }, { "cell_type": "markdown", "id": "f1e243d4", "metadata": {}, "source": [ "Wenn die Spaltennamen in den einzelnen Objekten unterschiedlich sind, könnt ihr sie separat angeben. Im folgenden Beispiel erhält `update2` den Schlüssel `U+` und nicht `Unicode`:" ] }, { "cell_type": "code", "execution_count": 7, "id": "9d310a26", "metadata": { "execution": { "iopub.execute_input": "2026-05-21T16:10:04.734368Z", "iopub.status.busy": "2026-05-21T16:10:04.734285Z", "iopub.status.idle": "2026-05-21T16:10:04.738369Z", "shell.execute_reply": "2026-05-21T16:10:04.738145Z", "shell.execute_reply.started": "2026-05-21T16:10:04.734361Z" }, "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
UnicodeDecimal_xOctal_xKey_xU+Decimal_yOctal_yKey_y
0U+00033003Ctrl-CU+00033003Ctrl-C
1U+00044004Ctrl-DU+00044004Ctrl-D
2U+00055005Ctrl-EU+00055005Ctrl-E
\n", "
" ], "text/plain": [ " Unicode Decimal_x Octal_x Key_x U+ Decimal_y Octal_y Key_y\n", "0 U+0003 3 003 Ctrl-C U+0003 3 003 Ctrl-C\n", "1 U+0004 4 004 Ctrl-D U+0004 4 004 Ctrl-D\n", "2 U+0005 5 005 Ctrl-E U+0005 5 005 Ctrl-E" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "update2 = pd.DataFrame(\n", " {\n", " \"U+\": [\n", " \"U+0003\",\n", " \"U+0004\",\n", " \"U+0005\",\n", " \"U+0006\",\n", " \"U+0007\",\n", " \"U+0008\",\n", " \"U+0009\",\n", " ],\n", " \"Decimal\": [3, 4, 5, 6, 7, 8, 9],\n", " \"Octal\": [\"003\", \"004\", \"005\", \"006\", \"007\", \"008\", \"009\"],\n", " \"Key\": [\n", " \"Ctrl-C\",\n", " \"Ctrl-D\",\n", " \"Ctrl-E\",\n", " \"Ctrl-F\",\n", " \"Ctrl-G\",\n", " \"Ctrl-H\",\n", " \"Ctrl-I\",\n", " ],\n", " },\n", ")\n", "\n", "encoding.merge(update2, left_on=\"Unicode\", right_on=\"U+\")" ] }, { "cell_type": "markdown", "id": "3978abc4", "metadata": {}, "source": [ "Ihr könnt `.merge` jedoch nicht nur für einen Inner Join verwenden, bei dem die Schlüssel im Ergebnis die Schnittmenge oder die gemeinsamen Elemente beider Tabellen sind. Weitere mögliche Optionen sind:\n", "\n", "Option | Verhalten\n", ":----- | :--------\n", "`how='inner'` | verwendet nur die Schlüsselkombinationen, die in beiden Tabellen vorkommen\n", "`how='left'` | verwendet alle Schlüsselkombinationen, die in der linken Tabelle vorkommen\n", "`how='right'` | verwendet alle Schlüsselkombinationen, die in der rechten Tabelle vorkommen\n", "`how='outer'` | verwendet alle Schlüsselkombinationen, die in beiden Tabellen vorkommen" ] }, { "cell_type": "code", "execution_count": 8, "id": "1c33c487", "metadata": { "execution": { "iopub.execute_input": "2026-05-21T16:10:04.738722Z", "iopub.status.busy": "2026-05-21T16:10:04.738658Z", "iopub.status.idle": "2026-05-21T16:10:04.743583Z", "shell.execute_reply": "2026-05-21T16:10:04.743350Z", "shell.execute_reply.started": "2026-05-21T16:10:04.738715Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
UnicodeDecimal_xOctal_xKey_xDecimal_yOctal_yKey_y
0U+00000000NULNaNNaNNaN
1U+00011001Ctrl-ANaNNaNNaN
2U+00022002Ctrl-BNaNNaNNaN
3U+00033003Ctrl-C3.0003Ctrl-C
4U+00044004Ctrl-D4.0004Ctrl-D
5U+00055005Ctrl-E5.0005Ctrl-E
\n", "
" ], "text/plain": [ " Unicode Decimal_x Octal_x Key_x Decimal_y Octal_y Key_y\n", "0 U+0000 0 000 NUL NaN NaN NaN\n", "1 U+0001 1 001 Ctrl-A NaN NaN NaN\n", "2 U+0002 2 002 Ctrl-B NaN NaN NaN\n", "3 U+0003 3 003 Ctrl-C 3.0 003 Ctrl-C\n", "4 U+0004 4 004 Ctrl-D 4.0 004 Ctrl-D\n", "5 U+0005 5 005 Ctrl-E 5.0 005 Ctrl-E" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "encoding.merge(update, on=\"Unicode\", how=\"left\")" ] }, { "cell_type": "code", "execution_count": 9, "id": "5a959622", "metadata": { "execution": { "iopub.execute_input": "2026-05-21T16:10:04.744083Z", "iopub.status.busy": "2026-05-21T16:10:04.743990Z", "iopub.status.idle": "2026-05-21T16:10:04.749312Z", "shell.execute_reply": "2026-05-21T16:10:04.749071Z", "shell.execute_reply.started": "2026-05-21T16:10:04.744076Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
UnicodeDecimal_xOctal_xKey_xDecimal_yOctal_yKey_y
0U+00000.0000NULNaNNaNNaN
1U+00011.0001Ctrl-ANaNNaNNaN
2U+00022.0002Ctrl-BNaNNaNNaN
3U+00033.0003Ctrl-C3.0003Ctrl-C
4U+00044.0004Ctrl-D4.0004Ctrl-D
5U+00055.0005Ctrl-E5.0005Ctrl-E
6U+0006NaNNaNNaN6.0006Ctrl-F
7U+0007NaNNaNNaN7.0007Ctrl-G
8U+0008NaNNaNNaN8.0008Ctrl-H
9U+0009NaNNaNNaN9.0009Ctrl-I
\n", "
" ], "text/plain": [ " Unicode Decimal_x Octal_x Key_x Decimal_y Octal_y Key_y\n", "0 U+0000 0.0 000 NUL NaN NaN NaN\n", "1 U+0001 1.0 001 Ctrl-A NaN NaN NaN\n", "2 U+0002 2.0 002 Ctrl-B NaN NaN NaN\n", "3 U+0003 3.0 003 Ctrl-C 3.0 003 Ctrl-C\n", "4 U+0004 4.0 004 Ctrl-D 4.0 004 Ctrl-D\n", "5 U+0005 5.0 005 Ctrl-E 5.0 005 Ctrl-E\n", "6 U+0006 NaN NaN NaN 6.0 006 Ctrl-F\n", "7 U+0007 NaN NaN NaN 7.0 007 Ctrl-G\n", "8 U+0008 NaN NaN NaN 8.0 008 Ctrl-H\n", "9 U+0009 NaN NaN NaN 9.0 009 Ctrl-I" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "encoding.merge(update, on=\"Unicode\", how=\"outer\")" ] }, { "cell_type": "markdown", "id": "fd6c3638", "metadata": {}, "source": [ "Die Join-Methode wirkt sich nur auf die eindeutigen Schlüsselwerte aus, die im Ergebnis erscheinen." ] }, { "cell_type": "markdown", "id": "843d8e88", "metadata": {}, "source": [ "Um mehrere Schlüssel zu verknüpfen, könnt ihr eine Liste mit Spaltennamen übergeben:" ] }, { "cell_type": "code", "execution_count": 10, "id": "5891c418", "metadata": { "execution": { "iopub.execute_input": "2026-05-21T16:10:04.749767Z", "iopub.status.busy": "2026-05-21T16:10:04.749664Z", "iopub.status.idle": "2026-05-21T16:10:04.754138Z", "shell.execute_reply": "2026-05-21T16:10:04.753963Z", "shell.execute_reply.started": "2026-05-21T16:10:04.749759Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
UnicodeDecimalOctalKey
0U+00000000NUL
1U+00011001Ctrl-A
2U+00022002Ctrl-B
3U+00033003Ctrl-C
4U+00044004Ctrl-D
5U+00055005Ctrl-E
6U+00066006Ctrl-F
7U+00077007Ctrl-G
8U+00088008Ctrl-H
9U+00099009Ctrl-I
\n", "
" ], "text/plain": [ " Unicode Decimal Octal Key\n", "0 U+0000 0 000 NUL\n", "1 U+0001 1 001 Ctrl-A\n", "2 U+0002 2 002 Ctrl-B\n", "3 U+0003 3 003 Ctrl-C\n", "4 U+0004 4 004 Ctrl-D\n", "5 U+0005 5 005 Ctrl-E\n", "6 U+0006 6 006 Ctrl-F\n", "7 U+0007 7 007 Ctrl-G\n", "8 U+0008 8 008 Ctrl-H\n", "9 U+0009 9 009 Ctrl-I" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "encoding.merge(update, on=[\"Unicode\", \"Decimal\", \"Octal\", \"Key\"], how=\"outer\")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.13 Kernel", "language": "python", "name": "python313" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.0" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": {}, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 5 }