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
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
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")
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