Gibt es eine Möglichkeit, PANDAS -Datenrahmen unter einer anderen Bedingung als der Schlüsselgleichheit zusammenzuführenPython

Python-Programme
Anonymous
 Gibt es eine Möglichkeit, PANDAS -Datenrahmen unter einer anderen Bedingung als der Schlüsselgleichheit zusammenzuführen

Post by Anonymous »

Angenommen, wir haben zwei Datenrahmen, die zusammengeführt werden müssen: < /p>

Code: Select all

import pandas as pd

df1 = pd.DataFrame()
df1["key"] = ["a", "b", "c"]
df1["low"] = [0, 1, 2]
df1["high"] = [2, 4, 6]

df2 = pd.DataFrame()
df2["key"] = ["a", "a", "a", "b", "b", "c"]
df2["value"] = [1, 2, 3, 2, 5, 0]

print(f"df1:\n{df1}")
print(f"df2:\n{df2}")
< /code>
Ausgabe: < /p>
df1:
key  low  high
0   a    0     2
1   b    1     4
2   c    2     6
df2:
key  value
0   a      1
1   a      2
2   a      3
3   b      2
4   b      5
5   c      0
< /code>
Wenn ich diese Datenrahmen zusammenführen möchte, so dass ich nur die Zeilen halte, wo "Schlüssel" übereinstimmt und "Wert" zwischen "niedrig" und "hoch" ist, weiß ich, wie das geht In zwei Schritten: < /p>
df = df1.merge(df2, how="inner", on="key")
df = df.loc[(df["value"] >= df["low"]) & (df["value"] 
Ausgabe: < /p>
df:
key  low  high  value
0   a    0     2      1
1   a    0     2      2
3   b    1     4      2
Aber dieser Ansatz ist möglicherweise nicht praktikabel, wenn die Datenrahmen groß sind, da das Zusammenführen der Datenframes im ersten Schritt eine lange Zeit dauern kann (siehe unten für weitere Details). < BR /> In SQL können wir die Verbindung mit einer solchen Abfrage problemlos durchführen: < /p>

Code: Select all

SELECT
df1.key,
df1.low,
df1.high,
df2.value
FROM df1
INNER JOIN df2
ON
df1.key = df2.key AND
df2.value BETWEEN df1.low AND df1.high
Gibt es eine Möglichkeit, diese Zusammenführung in Python in einem Schritt auszuführen? Für eine Lösung ohne zusätzliche Abhängigkeiten wie Pyjanitor oder andere Module neben Pandas. Operation, nicht zwei Operationen (wie .Merge und .loc), kombiniert auf einer einzelnen Zeile. /strong> < /p>
Einige Leute haben ähnliche Kommentare und Lösungen gepostet: < /p>

Code: Select all

df = df1.merge(df2, how="inner", on="key").loc[lambda r: (r["value"] >= r["low"]) & (r["value"] 
Diese Lösung funktioniert jedoch unpraktisch, da sie die Datenrahmen vor der Durchführung des Untersatzvorgangs verschmelzen. Wenn die Datenrahmen groß sind, kann df1.merge (df2, wie = "innere", auf = "Schlüssel") 
als Beispiel als Beispiel sehr teuer sein. Nehmen wir an, wir verwenden dieselben DataFrames df1 und df2 mit zusätzlichen Zeilen:

Code: Select all

import pandas as pd
add_rows = 10
random.seed(42)

df1 = pd.DataFrame()
df1["key"] = ["a", "b", "c"] + random.choices(["a", "b", "c"], k=add_rows)
df1["low"] = [0, 1, 2] + list(range(100, 100 + add_rows))
df1["high"] = df1["low"] + 2

df2 = pd.DataFrame()
df2["key"] = ["a", "a", "a", "b", "b", "c"] + random.choices(["a", "b", "c"], k=add_rows)
df2["value"] = [1, 2, 3, 2, 5, 0] + list(range(-add_rows, 0))

print(f"df1:\n{df1}")
print(f"df2:\n{df2}")
< /code>
Ausgabe: < /p>
df1:
key  low  high
0    a    0     2
1    b    1     3
2    c    2     4
3    b  100   102
4    a  101   103
5    a  102   104
6    a  103   105
7    c  104   106
8    c  105   107
9    c  106   108
10   a  107   109
11   b  108   110
12   a  109   111
df2:
key  value
0    a      1
1    a      2
2    a      3
3    b      2
4    b      5
5    c      0
6    a    -10
7    b     -9
8    a     -8
9    a     -7
10   b     -6
11   b     -5
12   a     -4
13   b     -3
14   c     -2
15   a     -1
Beachten Sie, dass die Werte in df2 ["value"] alle negativ sind, während die Werte in df1 ["niedrig"] und df1 ["High"] sind alle positiv, daher enthält das Endergebnis immer die gleichen 3 Zeilen, unabhängig davon, wie viele Zeilen hinzugefügt werden. = "Inner", auf = "Schlüssel") enthält 74 Zeilen und df = df1.merge (df2, wie = "inner", auf = "Schlüssel"). loc [lambda r: (r ["Wert "]> = r [" niedrig "]) & (r [" value "]

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post